Question

Utilisation Protobuf / Protobuf-net et deux classes, une classe de base et l'autre dérivé de la base.
Comment voulez-vous linéariser / désérialiser une liste?

Par exemple:

public class SomeBase
{
    ...
}

public class SomeDerived : SomeBase
{
    ...
}

Et le champ suivant à sérialiser:

public List<SomeBase> SomeList;

Gardez à l'esprit que la liste contient des objets UneBase et SomeDerived.

Était-ce utile?

La solution

Pour que cela fonctionne, il vous suffit d'attribuer une étiquette (nombre) qu'il utilisera pour identifier le sous-type. Fondamentalement, la spécification de fil de base « des tampons de protocole » ne gère pas l'héritage, de sorte protobuf-net, il réalise par héritage de modélisation comme encapsulation. Vous attribuez des balises sur les propriétés / champs avec [ProtoMember] et sous-types via [ProtoInclude] (comparer à [XmlInclude]).

Notez que les étiquettes doivent être uniques dans une à de type, mais ils peuvent être réutilisés dans les sous-types -. Comme le montre l'exemple par les deux niveaux en utilisant l'étiquette 1

comme ceci:

using System.Collections.Generic;
using ProtoBuf;

[ProtoContract]
[ProtoInclude(20, typeof(SomeDerived))]
public class SomeBase
{
    [ProtoMember(1)]
    public string BaseProp { get; set; }
}
[ProtoContract]
public class SomeDerived : SomeBase
{
    [ProtoMember(1)]
    public int DerivedProp { get; set; }
}
[ProtoContract]
public class SomeEntity
{
    [ProtoMember(1)]
    public List<SomeBase> SomeList;
}

class Program
{
    static void Main()
    {
        SomeEntity orig = new SomeEntity
        {
            SomeList = new List<SomeBase> {
                new SomeBase { BaseProp = "abc"},
                new SomeDerived { BaseProp = "def", DerivedProp = 123}
            }
        };
        var clone = Serializer.DeepClone(orig);
        // clone now has a list with 2 items, one each SomeBase and SomeDerived
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top