Comment sérialiser une classe héritée avec ProtoBuf-Net

Je suis désolé s’il s’agit d’un doublon. J’ai cherché plusieurs endroits pour trouver une réponse que je pourrais comprendre, notamment:

Les propriétés de la classe de base ProtoBuf.net ne sont pas incluses lors de la sérialisation de la classe dérivée

Sérialiser les classes héritées en utilisant protobuf-net

Mes excuses mais je n’ai pas vraiment compris les réponses. Je recherche un sérialiseur binary plus compact et plus rapide, et ProtoBuf semble pouvoir être la solution. J’ai besoin de sérialiser un ensemble de classes qui dérivent toutes d’une seule classe de base. Il y en a un grand nombre, alors avant de m’engager à éditer le code de la classe, j’ai fait un test simple. De plus, je ne souhaite pas modifier les classes d’une manière qui puisse avoir un impact sur la désérialisation des anciens fichiers persistants générés avec le sérialiseur binary NET.

C’est la classe de base:

[ProtoContract] public class BaseClass { [ProtoMember(1)] public ssortingng Name { get; set; } [ProtoMember(2)] public int Age { get; set; } } 

C’est la classe dérivée:

 [ProtoContract] public class SubClass1 : BaseClass { [ProtoMember(3)] public ssortingng Town { get; set; } [ProtoMember(4)] public Sex Sex { get; set; } } 

C’est le code à sérialiser et à désérialiser (tiré directement du Guide de démarrage

 var person = new SubClass1 { Age = 25, Name = "Fred", Town = "Denbigh", Sex = Sex.Female }; using (var file = File.Create(filename)) { Serializer.Serialize(file, person); } 

et désérialiser:

 SubClass1 newPerson; using (var file = File.OpenRead(filename)) { newPerson = Serializer.Deserialize(file); } MessageBox.Show(newPerson.Name + " : " + newPerson.Town + " : " + newPerson.Age.ToSsortingng() + " : " + newPerson.Sex); 

Le résultat est “: Denbigh: 0: Female”

D’une certaine manière, les valeurs des propriétés de la classe de base ne sont pas sérialisées? À l’origine, je l’avais testé avec les indices ProtoMember pour la classe dérivée tels que 1, 2. Je pensais que cela ne fonctionnerait pas, alors je suis allé pour 3, 4. Cela ne semble pas faire de différence. Dans ma paranoïa, j’ai exécuté le même test en utilisant le sérialiseur binary NET standard et obtenu le résultat attendu: “Fred: Denbigh: 25: Female”

Qu’est-ce qui me manque s’il vous plaît?

Vous devez utiliser l’atsortingbut ProtoInclude sur votre classe de base:

 [ProtoContract] [ProtoInclude(500, typeof(SubClass1 ))] public class BaseClass { 

L’argument id (500 dans l’exemple ci-dessus) doit être unique pour cette classe. Voir cet article pour plus d’informations

Je sais que c’est assez vieux, mais peut aider quelqu’un. Dans certains cas, vous pouvez résoudre ce problème en redéfinissant les propriétés de base dans votre sous-type:

 [ProtoContract] public class SubClass1 : BaseClass { [ProtoMember(1)] public ssortingng BaseName { get{return base.Name;} set{base.Name = value;} } ... [ProtoMember(3)] public ssortingng Town { get; set; } [ProtoMember(4)] public Sex Sex { get; set; } }