Xml 在VB.NET中永久更改对象类型
我有以下资料:Xml 在VB.NET中永久更改对象类型,xml,vb.net,casting,type-conversion,Xml,Vb.net,Casting,Type Conversion,我有以下资料: Public Class OldClass Inherits NewClass .... End Class NewClass继承自BaseClass 现在我有一个列表(基类) 我正在从XML反序列化其中一些对象。XML可以同时包含OldCLasses和NewCLasses 反序列化后,对象将显示在列表中 OldClass与NewClass完全相同(OldClass中唯一的代码是继承NewClass)。我必须创建旧类,因为XML中的元素名称已更改,我需要保持向后
Public Class OldClass
Inherits NewClass
....
End Class
NewClass
继承自BaseClass
现在我有一个列表(基类)
我正在从XML反序列化其中一些对象。XML可以同时包含OldCLass
es和NewCLass
es
反序列化后,对象将显示在列表中
OldClass
与NewClass
完全相同(OldClass
中唯一的代码是继承NewClass
)。我必须创建旧类,因为XML中的元素名称已更改,我需要保持向后兼容性
如何永久更改列表
中任何OldClass
对象的类型,以便当它们重新序列化时,它们会变成
,而不是
我试过CType
,OldClass.ChangeType
,list(list.indexOf(OldTypeObj)).ChangeType(…)
。。。什么都不管用。调试时,检查列表显示,OldClass
es仍仅此而已
编辑
我正在使用它序列化现有数据:
<XmlArray("lines")> _
<XmlArrayItem("CalculatedLine", GetType(Lines.CalculatedLine))> _
<XmlArrayItem("PointLine", GetType(Lines.PointLine))> _
<XmlArrayItem("line", GetType(Lines.OldLine))> _ <<This needs to become PointLine when serialized.
Public Property lines As List(Of Lines.Line) = New List(Of Lines.Line)
_
_
_
_您正在使用XmlSerializer
?显然,您可以在类定义中使用XmlRootAttribute
,将类名的定义重写为XML文档的根,这可能会有所帮助?下面的例子-
首先是类定义。XMLRoot
声明为ClassNew
,因此任何ClassOld
对象都将使用rootClassNew
序列化为XML,并重新序列化为ClassNew
对象-
Public Class ClassBase
Public Property name As String
End Class
Public Class ClassNew
Inherits ClassBase
End Class
<XmlRoot("ClassNew")>
Public Class ClassOld
Inherits ClassNew
End Class
然后反序列化到新类-
Dim objectListBefore As New List(Of ClassBase)
objectListBefore.Add(New ClassOld)
objectListBefore.Add(New ClassNew)
Dim nameList = New List(Of String)
For Each item In objectListBefore
item.name = Guid.NewGuid.ToString
nameList.Add(item.name)
Dim objStreamWriter As New StreamWriter(String.Format("C:\Temp\{0}.xml", item.name))
Dim xmlSerialiser1 As New XmlSerializer(item.GetType)
xmlSerialiser1.Serialize(objStreamWriter, item)
objStreamWriter.Close()
Next
Dim objectListAfter As New List(Of ClassBase)
Dim classNewObject As New ClassNew
Dim xmlSerialiser2 As New XmlSerializer(classNewObject.GetType)
For Each name In nameList
Dim objStreamReader As New StreamReader(String.Format("C:\Temp\{0}.xml", name))
Dim myOtherObject As New ClassNew()
myOtherObject = CType(xmlSerialiser2.Deserialize(objStreamReader), ClassNew)
objectListAfter.Add(myOtherObject)
objStreamReader.Close()
Next
End Sub