【问题标题】:Permanenetly change type of object in VB.NET永久更改 VB.NET 中的对象类型
【发布时间】:2017-02-27 21:50:47
【问题描述】:

我有以下几点:

Public Class OldClass
    Inherits NewClass
    ....
End Class

NewClass 继承自 BaseClass

现在我有一个list(Of BaseClass)

我正在从 XML 中反序列化其中的一些对象。 XML 可以同时包含OldCLasses 和NewCLasses。

反序列化后,对象在列表中。

OldClass完全NewClass 相同(OldClass 中的唯一代码是Inherits NewClass)。我不得不创建旧类,因为 XML 中的元素名称发生了变化,我需要保持向后兼容性。

如何永久更改list 中任何OldClass 对象的类型,以便在重新序列化它们时变为<NewClass ...> 而不是<OldClass ...>

我已经尝试过CTypeOldClass.ChangeTypelist(list.indexOf(OldTypeObj)).ChangeType(...)... 没有任何效果。调试时,检查列表显示OldClasses 仍然是这样。

编辑

我正在使用它来序列化现有数据:

<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)

【问题讨论】:

    标签: xml vb.net casting type-conversion


    【解决方案1】:

    您使用的是XmlSerializer 吗?显然(see MSDN) 您可以通过在类定义中使用XmlRootAttribute 来覆盖类名的定义作为XML 文档的根,这可能会有所帮助吗?下面的例子 -

    首先是类定义。 XMLRoot 被声明为ClassNew,因此任何ClassOld 对象都将被序列化为带有根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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      相关资源
      最近更新 更多