【问题标题】:XML Serializing objects that contain other objects (recursive serialization)XML 序列化包含其他对象的对象(递归序列化)
【发布时间】:2015-10-02 00:46:28
【问题描述】:

我有一个名为Port Characteristics 的类,如下所示:

<Serializable()> Public Class PortCharacteristics

    Public portNum As Int16

    Public bRate As Integer

    Public par As String

    Public len As String

    Public stopb As String

    Public flow As String

    Public Sub New()

    End Sub

    Public Sub New(ByVal valPortNum As Int16, ByVal valBRate As Integer, ByVal valPar As String, ByVal valLen As String, ByVal valStopb As String, ByVal valFlow As String)
        portNum = valPortNum
        bRate = valBRate
        par = valPar
        len = valLen
        stopb = valStopb
        flow = valFlow
    End Sub

End Class

我还有另一个类Profile,其中包含Port Characteristics

 <Serializable()> Public Class Profile

    Public profileName As String

    Public chars As PortCharacteristics

    Public Property PortChar As PortCharacteristics
        Get
            Return chars
        End Get
        Set(value As PortCharacteristics)
            chars = value
        End Set
    End Property

    Public Sub New()

    End Sub

    Public Sub New(ByVal profName As String, ByVal portNum As Int16, ByVal baud As Integer, ByVal par As String, ByVal length As String, ByVal stopB As String, ByVal flowCon As String)

        Name = profName

        PortChar = New PortCharacteristics(portNum, baud, par, length, stopB, flowCon)

    End Sub

End Class

我这样序列化 Profile 类:

If My.Computer.FileSystem.FileExists("profiles.xml") Then
    My.Computer.FileSystem.DeleteFile("profiles.xml")
End If

Using fs As New FileStream("profiles.xml", FileMode.OpenOrCreate)
    Dim Xml As New XmlSerializer(GetType(List(Of Profile)))
    Xml.Serialize(fs, ProfileList)
End Using

是否可以在同一个文件的 XML 对象中序列化对象,还是必须使用二进制或其他类型的序列化?

【问题讨论】:

  • 第二课的目的是什么?这不会按原样编译,PortCharString 例如引用不存在的属性/成员
  • 哦,对不起,我在 PortCharString 中取出了一些属性,以使其对问题更具可读性。 PortCharacteristics 是一组特征,PortProfile 是包含 PortCharacteristics 中的特征的不同设置的集合。
  • PortProfile is a collection 不,不是。它是一个添加了 ProfileName 的 PortItem。还有ProfileList是什么?

标签: xml vb.net serialization


【解决方案1】:

首先,不涉及递归,您“只是”将一个对象嵌套在另一个对象中。其次,Profile 类代码是错误的——它引用了不存在的成员; PortCharString 中列出的那些都不存在于其他类中。

我不知道Profile 扮演什么角色。如图所示,它只是一个将名称添加到PortCharacteristics 项目的包装器。这可以简单地添加到另一个类。如果Profile 旨在分配名称并存储多个项目,则它缺少任何类型的集合对象。还有其他问题,但我怀疑问题出在:

Dim Xml As New XmlSerializer(GetType(List(Of Profile)))
Xml.Serialize(fs, ProfileList)

我们无法从发布的内容中判断ProfileList 是另一个类型还是对象变量。这有效(我更改了一些名称):

Dim pList As New List(Of PortProfile)

pList.Add(New PortProfile("COM9:", 9, 1200, "E", "7", "1", "X"))
pList.Add(New PortProfile("COM13:", 13, 300, "E", "8", "1", "X"))

Using fs As New FileStream(PortProFileName, FileMode.OpenOrCreate)
    Dim Xml As New XmlSerializer(pList.GetType)
    Xml.Serialize(fs, pList)
End Using

确保XmlSerializer 构造函数中使用的Type 与正在使用的对象变量匹配,并且它将正常工作。

【讨论】:

  • 对不起,ProfileList 的声明是 List (of Profile)。没错,Profile 类只是将 PortCharacteristics 包装在一个类中,但除了 PortCharacteristics 之外还包含一些其他信息。
  • 它在你提到的第一个序列化行中给了我一个 InvalidOperationError (有一个错误反映类型'System.Collections.Generic.List),但是,就像我说的,ProfileList 是新列表(属于 Profile )。我还有什么可以告诉你的吗?
  • 好吧,魔鬼可能在细节中。我可以得到你发布的序列化/反序列化的版本就好了。那里可能还有其他内容,您没有共享,这会导致问题。深入了解内部异常以获取更多信息。 OTOH,Item 可以包含该额外信息,并且方法或属性根据需要返回子集。 1:1 的关系通常不是那么有用。
  • 问题是它没有将 PortCharacteristic 对象写入 XML 文件,并且它没有崩溃(我不小心注释掉了导致上一个错误的无参数构造函数)。它只是在 XML 文件中写入 ,不会抛出任何错误。
  • 听起来像是一个实施问题(或者可能是范围) - 您确定列表中有一些项目吗?你是如何添加它们的?您的项目类只有公共 fields 而不是属性,在这种情况下这无关紧要,但它可以。我的班级:pastebin.com/kED5zvh3 您应该能够将答案中的那个小 sn-p 粘贴到单击按钮中进行测试(当然,使用您的名字)。
猜你喜欢
  • 2011-01-11
  • 1970-01-01
  • 2018-03-20
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多