2009-03-30 11 views
2

Afin de masquer le code de l'application tout en continuant à utiliser la sérialisation pour enregistrer les données de l'application, je souhaite mapper les noms de tous les membres sérialisés aux noms de sérialisation personnalisés. Je sais que je peux y parvenir en implémentant l'ISerizableInterface, mais dans le MSDN, ils suggèrent l'utilisation de OnDeserializedAttribute, OnSerializingAttribute, OnSerializedAttribute et OnDeserializingAttribute pour la sérialisation. Donc, je voudrais utiliser le OnSerializingAttribute pour renommer mes membres. Le problème est que je ne peux pas trouver un moyen de déterminer explicitement les noms sous lesquels un membre est sérialisé.L'utilisation de .Net OnSerializingAttribute pour modifier les noms de variables?

Est-il possible de définir explicitement les noms pour la sérialisation à l'aide de OnSerializingAttribute?

Répondre

1

Je pense que la sérialisation personnalisée et l'interface ISerializable seront les plus efficaces dans votre cas. Consultez l'exemple here. Aussi here's un bon fil de discussion vers les deux ISerializable et les attributs de sérialisation que vous avez mentionnés.

Je dirais que si vous voulez avoir un contrôle total sur le format, vous devez utiliser un sérialiseur personnalisé et si vous voulez répondre au flux (de) sérialisation, les attributs sont la meilleure option.

1

(modifier: Je décidé d'écrire ceci comme un blog entry, comme je l'ai vu être utile un certain nombre de fois)

J'ai eu les utilisateurs avant de les utiliser pour ce protobuf-net; cela utilise le format de fil binaire "tampons de protocole" binaires de Google, qui n'inclut aucun nom sur le fil - juste des nombres. Cela signifie que:

  • les noms ne sont pas exposés sur le fil
  • il n'a pas d'importance si le nom de la classe lors de l'exécution est « DateOfBirth » ou « A1V »

Cela fonctionne en attribuant une balise entier aux membres (propriétés ou champs) - par exemple:

[ProtoMember(4)] 
public DateTime DateOfBirth {get;set;} 

Seul le « 4 » est utilisé dans la sérialisation, mais (surtout) vous n'avez pas besoin de maintenir un bon nombre de sérialisation code. Peut également être accroché en ISerializable très facilement si vous avez besoin d'utiliser la communication à distance, et dispose également d'un crochet WCF si vous le souhaitez.

Divulgation: Je suis l'auteur, donc je suis partial - mais l'outil est libre, de sorte que vous ne perdez rien en ayant un regard ;-P

+0

Sons que protobuf-net est le bon outil pour le travail, je vais lui donner un essayer. Bien que cela va évidemment rompre la compatibilité avec les fichiers de données de sérialisation existants. – phatoni

1

Si vous utilisez .NET4 ou .NET4.5 vous pouvez définir votre propre DataContractResolver pour renommer les attributs, mais il serait plus simple d'utiliser compacted named dans l'attribut [DataMember(...)]