gpt4 book ai didi

.net - 序列化缺少信息的自定义对象生成文件

转载 作者:行者123 更新时间:2023-12-04 04:32:36 24 4
gpt4 key购买 nike

我有问题。当我尝试 serialize我的自定义对象列表我的所有信息都丢失了。

我的序列化输出:

  <?xml version="1.0" ?> 
- <ArrayOfCustomObject xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CustomObject />
<CustomObject />
<CustomObject />
</ArrayOfCustomObject>

我有一些代码展示了我的序列化方法:
Dim xmlSerializer As New XmlSerializer(GetType(List(Of CustomObject )))

Using fileStrm As New StreamWriter("C:\Users\MyUser\Desktop\xmlTest.xml", FileMode.OpenOrCreate)
xmlSerializer.Serialize(fileStrm, objectsList)
End Using

CustomObject 在哪里:
Imports System.Xml.Serialization

<XmlRootAttribute("SomeObject")>
Public Class CustomObject

Sub New()

End Sub

Sub New(ByVal someTable As DataTable, ByVal id As Integer, ByVal title As String)
_someTable = someTable
_title = title
_id = id
End Sub

Private _someTable As DataTable
Private _title As String
Private _id As Integer

<XmlAttribute("Title")>
Public ReadOnly Property Title As String
Get
Return _title
End Get
End Property

<XmlAttribute("Table")>
Public ReadOnly Property SomeTable As DataTable
Get
Return _someTable
End Get
End Property

<XmlAttribute("ID")>
Public ReadOnly Property ID As Integer
Get
Return _id
End Get
End Property
End Class

我的错误在哪里? (如果 c# 更合适,请随意回答)

最佳答案

XmlSerializer将忽略没有 setter 的属性。

例如,在您的情况下,将忽略此属性:

<XmlAttribute("Table")>
Public ReadOnly Property SomeTable As DataTable
Get
Return _someTable
End Get
End Property

因为它是只读的:序列化程序被设计为双向工作,那么(从它的角度来看)序列化它以后无法反序列化的东西是没有意义的。

它会忽略一个属性的原因有很多(有关详细信息,请参阅 MSDN,列表很长并且并不总是那么明显)。如果您想保留 XmlSerializer,您可以做什么是添加一个 setter 方法或创建一个特殊对象(代理,类似于 BinarySerializer 所做的)用于反序列化,并将属性转发到当前对象:
<XmlRootAttribute("SomeObject")>
Public Class CustomObjectSurrogate

Sub New()
' Uncomment this if you plan to support deserialization too
' _realObject = New CustomObject()
End Sub

Sub New(realObject As CustomObject)
_realObject = realObject
End Sub

Private _realObject As CustomObject

<XmlAttribute("Table")>
Public Property SomeTable As DataTable
Get
Return _realObject.SomeTable
End Get
Set(value As DataTable)
' Ignore, this is a dummy object for serialization
End Set
End Property

' More properties here
End Class

有了这个,你将序列化 CustomObjectSurrogagte (不过是访问 CustomObject 属性的薄包装)。这样就可以保留 CustomObject实现尽可能干净。

好吧,当然你总是可以实现 IXmlSerializable接口(interface)强制 XmlSerializer做你想做的事,但可能需要做很多工作(特别是如果序列化接口(interface)可能/将与当前对象模型有很大不同)。

我喜欢 surragte 解决方案,特别是因为(没有 IXmlSerializable 的所有肮脏工作)允许我序列化(并最终反序列化)不同的东西(例如,我在考虑字典、通用集合和日期)。制作 CustomObjectSurrogate CustomObject 内的嵌套类你甚至不需要为 CustomObject 设置公共(public) setter 特性。

关于.net - 序列化缺少信息的自定义对象生成文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20328751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com