2009-04-16 11 views
2

J'essaie de trouver la meilleure façon de gérer la sérialisation dans mon programme.Sérialisation de classes contenant des génériques avec rétrocompatibilité

Je veux sérialisation des champs privés (donc sérialiseur XML est aucune option) Je veux sérialisation types génériques comme BindingList (SoapSerializer est pas d'option) Je veux aussi fournir un certain niveau de soutien pour pouvoir désérialiser objet de versions précédentes de mon programme.

Donc tout ce que je pense qu'il me reste est le BinarySerializer, et l'implémentation de l'interface ISerializable pour faire face à la compatibilité avant.

Est-ce correct?

Note: Je dois dire que j'ai trouvé ce projet. Cependant, le projet semblait mort et je ne pouvais pas le faire fonctionner (fichier manquant erreur) http://sourceforge.net/project/showfiles.php?group_id=196509

Répondre

1

Avec BinaryFormatter, vous pouvez utiliser [OptionalField], mais cela est encore very brittle.

Comment sur protobuf-net? Fait tout cela, et n'a pas les problèmes de versioning associés à BinaryFormatter. Comme il est basé sur le format "tampons de protocole" de Google, il est conçu pour être tolérant à la version et extensible (divulgation: je suis l'auteur, donc je peux être partial).

En variante, DataContractSerializer prend en charge la sérialisation de champ; il suffit de définir [DataMember] par rapport à vos champs au lieu des propriétés (nécessite .NET 3.0).

0

Oui, vous devez implémenter ISerializable.

Les points clés sont les suivants

  • Mettre en oeuvre GetObjectData (info SerializationInfo, contexte StreamingContext). Ici, vous devez ajouter des paires de clés dans l'objet info.
  • Implémenter le constructeur de sérialisation MyClass (informations SerializationInfo, contexte StreamingContext). Ici, vous devez obtenir les valeurs de l'objet info.
Questions connexes