كيفية استخدام قائمة/صفيف لبعض ميراث الكائنات مع protobuf/protobuf-net؟
-
20-09-2019 - |
سؤال
باستخدام 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
}
}