2016-10-18 16 views
1

内のオブジェクトの種類を変更:今、私はからこれらのオブジェクトの数をデシリアライズしていますlist(Of BaseClass)Permanenetly私は、次のしているVB.NET

を持ってBaseClass

から

Public Class OldClass 
    Inherits NewClass 
    .... 
End Class 

NewClass継承XML。 XMLにはOldCLass esとNewCLass esの両方を含めることができます。

デシリアライズ後、オブジェクトはリストにあります。

OldClassは(OldClassでのみコードがInherits NewClassある)NewClassと全く同じあります。 XMLで要素名が変更され、下位互換性を維持する必要があるため、古いクラスを作成する必要がありました。

、彼らが再直列化されたとき、彼らは<NewClass ...>代わりの<OldClass ...>なるようにどのように私は永久にlistのあらゆるOldClassオブジェクトの種類を変更できますか?

私は試しましたCTypeOldClass.ChangeTypelist(list.indexOf(OldTypeObj)).ChangeType(...) ...何も動作しません。デバッグするときに、リストを調べると、OldClassはそれだけであることがわかります。

EDIT

私は、既存のデータをシリアル化するためにこれを使用しています:

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

答えて

1

あなたはXmlSerializerを使用していますか?明らかに(see MSDN)あなたはクラス定義のXmlRootAttributeを使ってXMLドキュメントのルートとしてクラス名の定義を上書きできます。以下の例 -

最初にクラスの定義。 XMLRootClassNewとして宣言されているので、どの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 
+0

上記の私の編集を参照してください –

関連する問題