8
votes

Changer le nom de la classe étant sérialisée dans .NET?

Je peux cartographier les noms de classe entrants à l'aide d'un SerializationBinder et de remplacer la méthode BindTotype , mais j'ai trouvé aucun moyen de modifier le nom de la classe dans le processus de sérialisation. Est-ce possible du tout ??

EDIT:

Je fais référence à la sérialisation à l'aide du système System.Runtime.Sérialisation , et non le system.xml.serialisation . .

Merci!


6 commentaires

Pouvez-vous me décrire pourquoi vous voudriez faire cela? Je trouve souvent que s'il n'y a pas de fonction / méthode pour ce que j'essaie de faire, il me manque une solution beaucoup plus simple ou j'essaie juste de faire quelque chose d'impair.


Je tiens à faire cela pour faire le processus de sérialisation et de désérialisation indépendamment du nom de la classe, de sorte que si je renomme la classe ou modifier l'espace de noms de la classe, la sérialisation et la désérialisation ne changeraient pas du tout.


Quel type de sérialisation effectuez-vous? Binaire? Xml? Autre?


@Silky: C'est la nature de sérialisation qui utilise des formateurs, pas XML.


@Miguel est-il possible de passer à XML? Cela rendra votre vie beaucoup plus facile. La méthode de sérialisation binaire n'est pas faite pour gérer les modifications apportées à votre modèle d'objet.


J'ai trouvé un moyen de le faire !!! De toute façon, je ne voulais pas faire de la sérialisation XML, car il n'est pas très flexible, l'interface iserializable est beaucoup plus flexible.


4 Réponses :


10
votes

Je ne sais pas si je vous suis, mais vous pouvez utiliser xmltypeattribute. Vous pouvez ensuite récupérer facilement ses valeurs par réflexion.

[XmlType(Namespace = "myNamespaceThatWontChange",
TypeName = "myClassThatWontChange")]
public class Person
{
   public string Name;
}


2 commentaires

Mais il s'agit de xmlSérialisation, je parle de la sérialisation qui utilise l'interface SerializAlastRibute et Iséralisable.


La réponse de Islam Ibrahim est la «la» réponse (autant que je sache).



3
votes

Vous pouvez le faire avec des attributs: xxx


0 commentaires

0
votes

Regardez à l'aide d'un sélecteur de substitution de substitution + de substitution. Que conjointement avec un liant sur la désérialisation devrait faire le tour.


2 commentaires

C'est très intéressant, mais ce n'est pas ce que je cherchais. J'ai découvert que je peux utiliser l'objet SerializInfo du getObjectData Nom de l'Assemblée et FullTyPename Propriétés.


Ceci est plutôt dangereux dans la manière dont vous devrez peut-être que vous ayez besoin de sérialiser des cas de contextes indifférents. I.E. Transfert de données entre niveaux, clonage, péristance, etc. Si vous allez faire cette voie, assurez-vous de spécifier le contexte de diffusion en continu. (Exemple) Formatter.context = nouveau system.Runtime.Serialization.streamingContext (System.Runtime .Sériialization.strea MingContextatStates.cr ossmachine); et soyez au courant que vous serez attaché au classeur que vous nommez les articles pour.



7
votes

J'ai découvert que je peux utiliser l'objet SerializizIfo CODE> qui figure dans la fonction getObjectData ​​CODE> et modifiez le nom de l'Assemblée code> et et FullTyPename CODE> Propriétés, de sorte que lorsque je désexiste, je peux utiliser un SerializationBinder Code> pour mapper l'assemblage personnalisé et le nom de type retour à un type valide. Voici un Semple:

CLASSE SERIALISABLE: STRAND> P>

var fs = GetStream();
MyCustomClass obj = GetObjectToSerialize();
BinaryFormatter f = new BinaryFormatter();
f.Deserialize(fs, obj);


0 commentaires