【问题标题】:Serializing when class inherits list (of object)当类继承列表(对象)时序列化
【发布时间】:2014-06-22 21:05:55
【问题描述】:

我有一个 BOOKING 类,它继承了一个(消息的)列表 我想知道如何序列化这个。 我的 BOOKING 类包含 Message 的属性和 3 个属性,称为合作伙伴、事务和版本,

我的 Message 类有许多用于创建预订的属性,

现在当我想序列化时,我使用它

Dim z As New BOOKING
Dim x As New Message
z.partner = "company name"
z.transaction = "BOOKING"
z.version = "1.0"
x.MessageType = "C"
x.CustomerNumber = "123"
x.BookingReference = "5845"
x.CustomerBookingReference = "036598"
x.OutwardRoute = "PEMROS"
x.SailingDate = "20120107"
z.Message = x
SaveAsXML(z)

使用下面的另存为xml功能代码

Public Shared Function SaveAsXML(ByRef val As BOOKING)
    Try

        Dim objStreamWriter As New StreamWriter("c:\ftptest\New Booking\" + val.FileName)
        Dim y As New XmlSerializer(val.GetType)
        y.Serialize(objStreamWriter, val)
        objStreamWriter.Close()

        Return True
    Catch ex As Exception
        Throw ex
    End Try
End Function

知道我哪里出错了吗?

我的BOOKING类如下

Public Class BOOKING : Inherits List(Of Message)


Private Property MessageProperty As Message

<XmlAttribute>
Public Property partner As String
<XmlAttribute>
Public Property transaction As String
<XmlAttribute>
Public Property version As String


Public Property Message As Message
    Get
        Return MessageProperty
    End Get
    Set(value As Message)
        MessageProperty = value
    End Set
End Property

这里也是上面代码创建的xml。

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

这是我的反序列化代码

 Try
        Dim Samples As BOOKING
        Using objStreamReader As New StreamReader(filepath) 'Path where file is
            Dim x As New XmlSerializer(GetType(BOOKING), New XmlRootAttribute("BOOKING"))
            Samples = x.Deserialize(objStreamReader)
        End Using
        Form1.DataGridView1.DataSource = Samples
        Return True
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

【问题讨论】:

  • 什么不起作用?你有错误信息吗?
  • 嗨,当我没有预订类继承消息时,它会使用上面的代码序列化没有问题,但是当它继承它时,我没有收到任何错误并且没有序列化它仍然会创建 xml 文件但它是空的
  • this的可能重复
  • 那个副本似乎也是如何使属性序列化,对不起我对c#不太熟悉。当我在“z.message = x”处使用断点并且 SaveasXML(Z) z.message 具有 xml 的所有要求但它似乎没有将它们传递给 z 本身时,
  • 如果您将捕获代码更改为MessageBox.Show(ex.Message),而不是抛出您正在捕获的相同错误,您将收到正确的错误消息。序列化的一个关键是类和属性上使用的属性。编辑您的帖子以显示 Booking 的样子。

标签: xml vb.net serialization


【解决方案1】:

您的类结构使序列化程序感到困惑。如果Booking 继承自 List(Of Message) 那么它也有一个Message 类型为Message 的属性几乎没有意义(因为它已经是一个消息类型)。它成为一个自我参考。我还做了一些其他问题和调整,并且序列化得很好:

Public Class BOOKING
    Public Property partner As String
    Public Property transaction As String
    Public Property version As String
    Public Property XMsgs As New List(Of XMessage)
End Class


Public Class XMessage
    Public Property A As String
    Public Property C As String
    Public Property B As String
End Class

a) Public Property Message As Message 不建议在 VB 中为属性赋予与类型相同的名称。因此我使用了 XMessage

b) 你没有正确使用 XMLAttribute。应该有几个IDE错误,XML序列化不需要它

c) 为了每个数据包处理多个消息,我将 XMsgs 更改为 List 属性。这允许一个 BOOKING 数据集用于许多消息。如果您希望每次预订 1 条消息,则不需要 2 节课,只需将其设为列表(预订)。

d) 摆脱了用作支持字段的私有属性。

测试和序列化代码:

   Dim B As New BOOKING

    B.partner = "abcdef"
    B.transaction = "12345"
    B.version = "1.00.1"
    Dim m As New XMessage

    m.A = "foo"
    m.B = "bar"
    B.XMsgs.Add(m)        ' use List prop as a List

    ' Using block to dispose of streamwriter
    Using sr As New System.IO.StreamWriter("c:\Temp\Booking.xml")
        Dim y As New Serialization.XmlSerializer(B.GetType)
        y.Serialize(sr, B)

    End Using

【讨论】:

  • 谢谢你,再问一个问题,你将如何反序列化?这是我目前反序列化它的代码。我在原始问题中添加了反序列化代码
  • 反序列化:Dim bb As BOOKING 然后 bb = CType(y.Deserialize(New System.IO.StreamReader("c:\Temp\Booking.xml")), BOOKING) 或将其放入答案中的 USING 块中
  • 我注意到,当我运行代码时,xml 元素现在如下所示。 此处的所有消息属性 但是,当我将其传递给网站时,它只能如下所示 我该如何解决这个问题?
  • 对于多个消息,我的结果不是这样:Booking/Msgs/Message/Message,所以我们有不同的实现。每个数据包允许多少个味精?有限制吗?如果不允许 Msgs 包装器,则不能使用 List
  • 我没有确切的信息但我认为每次预订只允许一条消息我对 xml 和序列化非常陌生,我认为在预订中包含消息的唯一方法是新类,因为消息包含预订的所有属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多