2008-09-11 7 views
3

Nous avons un graphe d'objets assez volumineux qui doit être sérialisé et désérialisé de différentes manières (modes). Dans certains modes, nous voulons que certaines propriétés soient désérialisées et, dans d'autres, nous ne le faisons pas. Dans les modes futurs, il est également possible qu'il y ait plus d'options pour les propriétés que oui ou non. Le problème est maintenant de savoir comment nous implémentons ces modes.Problème de conception de classe de sérialisation .NET

Approche A (utilisation du constructeur de désérialisation et ISerializable.GetObjectData):

Si nous laissons chaque objet du graphe serialize lui-même en utilisant un constructeur de désérialisation nous obtenons un des commutateurs de lot pour tous les différents modes de désérialisation. L'avantage de cette approche est cependant que toute la logique de désérialisation est à un emplacement et si nous ajoutons de nouvelles propriétés, nous avons juste besoin de modifier ISerializable.GetObjectData et le constructeur de désérialisation. Un autre avantage est que l'objet peut prendre en compte des états internes susceptibles d'être exposés publiquement. L'inconvénient le plus important est que nous avons besoin de connaître tous les modes de sérialisation possibles. Si nous avons besoin d'un nouveau mode, nous devons modifier les objets de données.

Approche B (Désérialisation classes usine/Méthodes):

Une autre approche serait d'avoir une sorte d'usine Désérialisation classes/méthodes un pour chaque mode qui fait la sérialisation et la désérialisation externe (par exemple GraphSerializer.SerializeObjectTypeX (ObjectTypeX objectToSerialze). L'avantage ici est que chaque fois que nous voulons un nouveau mode, nous ajoutons simplement une nouvelle classe/méthode d'usine et notre Dataobject ne sont pas encombrés par tous les modes de sérialisation qui sont introduits.Le principal inconvénient ici est que je devrais écrire le même code de sérialisation encore et encore pour tous les différents modes.Si deux modes diffèrent juste dans une ou deux propriétés, mais je devrais implémenter le la logique pour l'ensemble du graphique à nouveau. Lorsque j'ajoute une nouvelle propriété à un objet de données, j'ai besoin de mettre à jour toutes les classes de fabrique.

Donc je me demande s'il y a une meilleure approche à ce problème général IMHO. Ou même une bonne pratique dans .NET? Ou peut-être que j'approche juste le tout d'une mauvaise perspective?

Répondre

2

Créez des classes de sérialiseurs séparées (a-la XmlSerializer) pour chaque mode, héritez ou encapsulez pour éviter la duplication. Utiliser les attributs des propriétés pour marquer si et comment ils doivent être sérialisés en mode spécifique

Questions connexes