序列化包含对象列表的对象

时间:2014-08-08 13:34:38

标签: vb.net serialization xmlserializer

我正在构建一个NotInheritable Serilizer,它可以成功地为我的所有类和类列表进行serilize。 直到我构建一个包含类列表的类列表。 我正在获取运行时Exeption:生成XML文档时出错。导致完全空的XML:(

这些是我的serilize课程:

<System.Serializable> _
<System.Xml.Serialization.XmlInclude(GetType(StatisticItem))> _
Public Class Statistic
    Public StatItem As New list(Of StatisticItem)
    'Bla bla bla
end class


<Serializable> _
Public Class StatisticItem              
        Private stStatPath As String = ""    
        Private eStatType As StatType = 0
        Private iBatchNumber As Int32 = 0
end class

序列化器:

Public NotInheritable Class XmlSerializer       

    Public Shared Sub Serialize(Of T)(ByVal obj As T, sConfigFilePath As String)        
        Dim XmlBuddy As New System.Xml.Serialization.XmlSerializer(GetType(T))
        Dim MySettings As New System.Xml.XmlWriterSettings()
        MySettings.Indent = True
        MySettings.CloseOutput = True       
        Dim MyWriter As System.Xml.XmlWriter=System.Xml.XmlWriter.Create(sConfigFilePath,MySettings)        
        XmlBuddy.Serialize(MyWriter,obj) 
        MyWriter.Flush()
        MyWriter.Close()    

        ' ----- OLD CODE FOR SERIALIZE, NEXTLINE IN XML DOESNT WORK ON WIN CE -------, 
        ' B.T.W. Using This code to serilize gives the exact same fault             
        'Dim XmlBuddy As New System.Xml.Serialization.XmlSerializer(GetType(T))
        'Dim objStreamWriter As New StreamWriter(sConfigFilePath)
        'XmlBuddy.Serialize(objStreamWriter, obj)
        'objStreamWriter.Close()
    End Sub
 end class

这就是电话:

 XmlSerializer.Serialize(Of list(Of Statistic))(StatCollection, CommCtrl.PathStatisticFile)

如果我对StatisticItem中的列表进行评论,一切正常。

我认为如果我在StatisticItem中实现IXmlSerializable,我可以告诉序列化器如何工作以使其工作,但我在互联网上看到其他代码示例,无需所有这些工作 我更喜欢一个干净的解决方案,这与我所有其他课程大致相同。

希望你们其中一个人可以帮助我

2 个答案:

答案 0 :(得分:2)

是的,已经解决了!说实话,我改变了很多小事,我仍然不知道原因是什么。 也许还有一些私人成员。 无论如何,这些代码可能对任何人都有用:

Public Class Statistic 

    'Properties         
    Private eStatName As String                     
    Private eStatSort As StatSort            
    Private StatItem As New list(Of StatisticItem)


    Public Property Name() As String
      Get
          Return eStatName
      End Get
      Set(ByVal value As String)
          eStatName = value
      End Set
    End Property

    'Other public properties
End class



Public Class StatisticItem  
    Private stStatPath As String = ""    
    Private eStatType As StatType = 0
    Private iBatchNumber As Int32 = 0

Public Property Path() As String
    Get
        Return stStatPath
    End Get
    Set(ByVal Value As String)
        stStatPath = Value
    End Set
End Property

' The other Public Properties

串行:

Public NotInheritable Class XmlSerializer

    ''' <summary>
    ''' Convert a class state into XML
    ''' </summary>
    ''' <typeparam name="T">The type of object</typeparam>
    ''' <param name="obj">The object to serilize</param>
    ''' <param name="sConfigFilePath">The path to the XML</param>
    Public Shared Sub Serialize(Of T)(ByVal obj As T, sConfigFilePath As String)        
        Dim XmlBuddy As New System.Xml.Serialization.XmlSerializer(GetType(T))
        Dim MySettings As New System.Xml.XmlWriterSettings()
        MySettings.Indent = True
        MySettings.CloseOutput = True       
        Dim MyWriter As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(sConfigFilePath,MySettings)      
        XmlBuddy.Serialize(MyWriter,obj) 
        MyWriter.Flush()
        MyWriter.Close()    
    End Sub



''' <summary>
''' Restore a class state from XML
''' </summary>
''' <typeparam name="T">The type of object</typeparam>
''' <param name="xml">the path to the XML</param>
''' <returns>The object to return</returns>
Public Shared Function Deserialize(Of T)(ByVal xml As String) As T      
    Dim XmlBuddy As New System.Xml.Serialization.XmlSerializer(GetType(T))
    Dim fs As New FileStream(xml, FileMode.Open)
    Dim reader As New Xml.XmlTextReader(fs) 
    If XmlBuddy.CanDeserialize(reader) Then
        Dim tempObject As Object = DirectCast(XmlBuddy.Deserialize(reader), T)         
        reader.Close()
        Return tempObject
    Else
        Return Nothing
    End If
End Function
end class

Serializer的调用:

Try                     
     XmlSerializer.Serialize(Of list(Of Statistic))(StatCollection, CommCtrl.PathStatisticFile)
Catch ex As Exception
     msgbox(ex.Message)
End Try

deSerializer的召唤:

Try
     StatCollection = XmlSerializer.Deserialize(Of list(Of Statistic)(CommCtrl.PathStatisticFile)
Catch ex As Exception
     msgbox(ex.Message)
end Try

答案 1 :(得分:0)

我也需要这样做但是创建一个字符串。这是我的解决方案:

    Public Shared Function Serialize(Of T)(ByVal obj As T) As String
        Dim xml As New System.Xml.Serialization.XmlSerializer(GetType(T))
        Dim ns As New System.Xml.Serialization.XmlSerializerNamespaces()
        ns.Add("", "") 'No namespaces needed.
        Dim sw As New IO.StringWriter()
        xml.Serialize(sw, obj, ns)

        If sw IsNot Nothing Then
            Return sw.ToString()
        Else
            Return ""
        End If
    End Function


    Public Shared Function Deserialize(Of T)(ByVal serializedXml As String) As T
        Dim xml As New System.Xml.Serialization.XmlSerializer(GetType(T))
        Dim sr As New IO.StringReader(serializedXml)
        Dim obj As T = CType(xml.Deserialize(sr), T)

        Return obj
    End Function