2016-10-18 4 views
1

Ich habe folgendes:Permanenetly Art von Objekt in VB.NET ändern

Public Class OldClass 
    Inherits NewClass 
    .... 
End Class 

NewClass Erbt von BaseClass

Jetzt habe ich eine list(Of BaseClass)

ich einige dieser Objekte am Deserialisieren von XML. Das XML könnte sowohl OldCLass es als auch NewCLass es enthalten.

Nach der Deserialisierung befinden sich die Objekte in der Liste.

OldClass ist genau die gleiche wie NewClass (der einzige Code in OldClass ist Inherits NewClass). Ich musste die alte Klasse erstellen, weil der Elementname im XML geändert wurde und ich Abwärtskompatibilität beibehalten muss.

Wie kann ich den Typ permanent von irgendwelchen in der listOldClass Objekte ändern, so dass, wenn sie erneut serialisiert werden, werden sie <NewClass ...> statt <OldClass ...>?

Ich habe versucht CType, OldClass.ChangeType, list(list.indexOf(OldTypeObj)).ChangeType(...) ... Nichts funktioniert. Beim Debuggen zeigt die Überprüfung der Liste, dass die OldClass es immer noch sind.

EDIT

ich dies mit Hilfe der vorhandenen Daten serialisieren:

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

Antwort

1

Sie die XmlSerializer verwenden? Anscheinend (see MSDN) können Sie die Definition des Klassennamens als Wurzel des XML-Dokuments überschreiben, indem Sie XmlRootAttribute in Ihrer Klassendefinition verwenden, was helfen könnte? Beispiel unten -

Zuerst die Klassendefinitionen. Die XMLRoot als ClassNew erklärt, so dass alle ClassOld Objekte werden mit der Wurzel ClassNew, und so serialisierten in ClassNew Objekte zu XML serialisiert werden -

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 

So ist es zu testen zunächst die Objekte serialisiert werden (was der alte sein kann, oder die neue Klasse) -

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 

Und dann auf die neue Klasse deserialisieren -

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

siehe meine Bearbeitung oben –

Verwandte Themen