2011-08-16 45 views
0

我知道你不能序列化一个接口,但为了讨论的目的,Interface和Domain Data类之间有一对一的映射,所以我假设/希望有一种方法可以告诉序列化程序在看到给定接口时使用该域类。如何序列化/反序列化一个通用的滚动接口集合

我有一个相当简单的层次结构对象结构

  • 资料<标准类
    • 元素<手卷的接口类的集合:节点(OF IProfile)
      • 元<标准类
    • 研究<手卷集合类:节点(中IStudy)
      • 研究<标准类

元素集合的声明如下:

Public Class Elements 
    Inherits Domain.Nodes(Of Domain.IElement) 
    Implements Domain.IElements 

    Public Sub New() 
     MyBase.New() 
    End Sub 

    Public Sub New(ByVal pItems As IEnumerable(Of Domain.IElement)) 
     MyBase.New(pItems) 
    End Sub 

End Class 

其他原因我不是继承自List(Of T)或键控集合或任何东西,Nodes是手卷集合,但是我正在实现IEnumerable(Of T)在Nodes(Of T)基类中。

所以我试图序列化/反序列化为XML在尽可能最小的痛苦和努力。我被引导使用<DataContract()>,<CollectionDataContract()><DataMember()>,但我愿意考虑其他选项。

我反序列化功能目前看起来像:

Private Shared Function Deserialize(ByVal pFilePath As String) As Domain.IProfile 
    Dim lNewItem As Domain.IProfile 
    Dim lProfileSerializer As New System.Xml.Serialization.XmlSerializer(GetType(Domain.Profile)) 
    lNewItem = CType(lProfileSerializer.Deserialize(Store.OpenFile(pFilePath, IO.FileMode.Open)), Domain.Profile) 
    Return lNewItem 
End Function 

所以,你会如何建议我处理这个?是否有一个简单的属性,我可以用它来说CollectionDataContract“创建孩子类为'元素'”...

回答

0

我还没有做过很多关于XML序列化,但我想你还需要将Serializable属性添加到您的类或其他任何。请注意,虽然有一些属性不能应用。

看见:>>

http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx

<Serializable()> _ 
Public Class ExampleClass 

End Class 
+0

谢谢,我已经通过阅读,我问这个问题的原因是,目前还不清楚如何通过处理集合为<序列化()>或当集合持有一个接口...基本上我希望听到或类似的 –