2008-09-11 6 views
3

Wir haben ein ziemlich großes Objektdiagramm, das in vielen verschiedenen Arten (Modi) serialisiert und deserialisiert werden muss. In einigen Modi möchten wir bestimmte Eigenschaften deserialisieren und in anderen nicht. In zukünftigen Modi könnte es auch möglich sein, dass es mehr Optionen für Eigenschaften als Ja oder Nein gibt. Das Problem ist jetzt, wie wir diese Modi implementieren..NET-Serialisierungsklassenentwurfsproblem

Ansatz A (Verwendung Deserialisierungskonstruktor und ISerializable.GetObjectData):

Wenn wir jedes Objekt des Graphen serialize selbst mit einem Deserialisierungskonstruktor wir viele Schalter für die verschiedenen Modi der Deserialisierung erhalten lassen. Der Vorteil dieses Ansatzes besteht jedoch darin, dass sich die gesamte Deserialisierungslogik an einer Position befindet und wenn wir neue Eigenschaften hinzufügen, müssen wir nur den ISerializable.GetObjectData und den Deserialisierungskonstruktor ändern. Ein weiterer Vorteil ist, dass das Objekt möglicherweise interne Zustände berücksichtigt, die öffentlich verfügbar gemacht werden könnten. Der wichtigste Nachteil ist, dass wir selbst Daten über alle möglichen Serialisierungsmodi wissen müssen. Wenn wir einen neuen Modus benötigen, müssen wir die Datenobjekte modifizieren.

Ansatz B (Deserialisierung Factory-Klassen/Methoden):

Ein anderer Ansatz wäre, eine Art Deserialisierung Factory-Klassen haben/Methoden eine für jeden Modus, der die Serialisierung und Deserialisierung funktioniert extern (zB GraphSerializer.SerializeObjectTypeX (ObjectTypeX objectToSerialze) Der Vorteil hier ist, dass wir, wann immer wir einen neuen Modus wollen, einfach eine neue Factory Class/Method hinzufügen und unser DataObject nicht mit allen eingeführten Serialisierungsmodi überladen wird. Der Hauptnachteil hier ist, dass ich müsste schreibe den gleichen Serialisierungscode immer wieder für die verschiedenen Modi, wenn zwei Modi sich nur in einer oder zwei Eigenschaften unterscheiden, aber ich müsste den Comple implementieren te Logik für das ganze Diagramm erneut. Wenn ich einem Datenobjekt eine neue Eigenschaft hinzufüge, muss ich alle Factory-Klassen aktualisieren.

Also frage ich mich, ob es einen besseren Ansatz für dieses allgemeine Problem IMHO gibt. Oder sogar eine Best Practice in .NET? Oder komme ich gerade aus einer falschen Perspektive auf das Ganze zu?

Antwort

2

Erstellen Sie separate Serializer-Klassen (a-la XmlSerializer) für jeden Modus, erben oder inkompilieren, um eine Duplizierung zu vermeiden. Verwenden Sie Attribute für Eigenschaften, um zu markieren, ob und wie sie im spezifischen Modus serialisiert werden sollen