c# - DataContract-Serialisierung - Basis-Klassen, Vererbung und Überschreibt

Guten Tag an alle,

Ich bin eine unabhängige game-Entwickler, hat in der Vergangenheit, vor allem mit XNA gearbeitet und, im anderen extrem, Gewerbe-toolsets. Die Reichweite von XNA ist ziemlich begrenzt, aber, und ich Baue ein cross-Plattform-Abstraktionsschicht für mehrere Zielplattformen.

Zu schneiden eine lange Geschichte kurz, ich brauchte, xml-Serialisierung, die zugänglich ist breiter als [Serializable], und ich habe darauf hingewiesen, Daten-Verträge. Ich habe dabei eine Menge Forschung, aber finde keine guten Informationen über einige der Grundlagen des Systems, in Bezug auf die erbschaft-und überschreibt.

Den Kern meiner Frage ist...

[DataContract]
public class Node
{
    private string name;

    public string Name { get { return name; } set { name = value; } }
    public virtual float Rotation { get { return 0f; } set { } }
}

[DataContract]
public class FancyNode : Node
{
    private float rotation;

    public override float Rotation { get { return rotation; } set { rotation = value; } }
}

Wenn ich serialisieren eines 'FancyNode', wird 'Rotation' werden korrekt serialisiert, und 'Name' werden serialisierte?

Follow-up-Frage:
Ich meinte, Sie zu bitten, früher, aber konnte sich nicht erinnern, an die Zeit. Wie funktioniert der serializer-handler überschrieben [IgnoreDataMember] Eigenschaften? Zum Beispiel...

[DataContract]
public class Simple
{
    [IgnoreDataMember]
    public virtual string Value { get { return ""; } set { } }
}

[DataContract]
public class Complex : Simple
{
    private string value;

    public override string Value { get { return value; } set { this.value = value; } }
}

Würden 'Wert' in 'Komplexen', die serialisiert werden? Einige Antworten schlagen vor, dass, wenn keine [DataMember] - tags verwendet werden, alle Eigenschaften, die serialisiert werden. Wenn ja, funktioniert der [IgnoreDataMember] - Attribut der Basisklasse, irgendwelche Lager?

  • Sie müssen auch FancyNode mit KnowType für typeof(Knoten), da es XML (Daten-basiert)...
  • Wenn Sie nicht hinzufügen DataMember alle Requisiten werden so behandelt, als DataMembers (in .NET 4 (glaube ich)), aber wenn Sie diejenigen, die ohne nicht serialisiert werden.
  • Ich würde gerne versuchen, aber ich dachte, ich könnte profitieren von den Erfahrungen der anderen. In Kürze werde ich brauchen, um entdecken Sie die Implementierung selbst, aber wenn ich besser vorbereitet sein, es könnte sparen Sie viel frustration.
  • So haben Sie verwenden, um KnowType für alle "base classes" einer Klasse? Ich hatte den Eindruck Sie brauchte nur zu verwenden für die Fälle, in denen ein Datenelement enthalten könnte Deserialisieren Instanzen von Klassen geerbt?
  • Hängt davon ab, wie Sie wollen, um die Klasse zu verwenden Beziehung, siehe msdn.microsoft.com/en-us/library/ms730167.aspx
InformationsquelleAutor Nathan Runge | 2012-06-20
Schreibe einen Kommentar