كيفية استخدام قائمة/صفيف لبعض ميراث الكائنات مع protobuf/protobuf-net؟

StackOverflow https://stackoverflow.com/questions/1363899

سؤال

باستخدام protobuf/protobuf-net وفئتين ، فئة قاعدة واحدة والآخر مشتق من القاعدة.
كيف يمكنك التسلسل/إزالة القائمة؟

على سبيل المثال:

public class SomeBase
{
    ...
}

public class SomeDerived : SomeBase
{
    ...
}

والمجال التالي ليتم تسلسله:

public List<SomeBase> SomeList;

ضع في اعتبارك أن القائمة تحتوي على بعض الأشياء ذات يوم.

هل كانت مفيدة؟

المحلول

للحصول على هذا العمل ، تحتاج ببساطة إلى تعيين علامة (رقم) ستستخدمها لتحديد النوع الفرعي. في الأساس ، لا تتعامل مواصفات سلك "بروتوكول المخازن المؤقتة" الأساسية للميراث ، لذلك يحقق ذلك Protobuf-Net من خلال نمذجة الميراث كغسل. يمكنك تعيين علامات على الخصائص/الحقول مع [ProtoMember], والأنواع الفرعية عبر [ProtoInclude] (قارن ب [XmlInclude]).

لاحظ أن العلامات يجب أن تكون فريدة من نوعها داخل أي غير متزوج اكتب ، ولكن يمكن إعادة استخدامها في الأنواع الفرعية-كما هو موضح في المثال من خلال كلا المستويين باستخدام العلامة 1.

مثل ذلك:

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
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top