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
对象都将使用root
ClassNew
序列化为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