[英]How to Serialize Inherited Class with ProtoBuf-Net
如果這是重復,我很抱歉。 我在幾個地方搜索了一些我可能理解的答案,包括:
我道歉但我並不真正理解答案。 我正在尋找一個更快,更緊湊的二進制序列化器,ProtoBuf看起來可能是答案。 我需要序列化一組所有派生自一個基類的類。 它們有很多,所以在提交編輯類代碼之前,我運行了一個簡單的測試。 此外,我不想以任何可能影響反序列化使用NET二進制序列化程序生成的舊持久文件的方式修改類。
這是基類:
[ProtoContract]
public class BaseClass
{
[ProtoMember(1)]
public string Name
{
get; set;
}
[ProtoMember(2)]
public int Age
{
get; set;
}
}
這是派生類:
[ProtoContract]
public class SubClass1 : BaseClass
{
[ProtoMember(3)]
public string Town
{
get; set;
}
[ProtoMember(4)]
public Sex Sex
{
get; set;
}
}
這是序列化和反序列化的代碼(直接來自“入門指南”
var person = new SubClass1 { Age = 25, Name = "Fred", Town = "Denbigh", Sex = Sex.Female };
using (var file = File.Create(filename))
{
Serializer.Serialize(file, person);
}
和反序列化:
SubClass1 newPerson;
using (var file = File.OpenRead(filename))
{
newPerson = Serializer.Deserialize<SubClass1>(file);
}
MessageBox.Show(newPerson.Name +
" : " + newPerson.Town +
" : " + newPerson.Age.ToString() +
" : " + newPerson.Sex);
結果是“:Denbigh:0:女性”
不知何故,基類屬性的值沒有被序列化? 我最初用派生類的ProtoMember索引測試它為1,2。我覺得這樣做不行,所以去了3,4。它似乎沒有區別。 在我的偏執狂中,我使用標准的.NET二進制序列化程序運行相同的測試,得到了預期的結果:“Fred:Denbigh:25:Female”
我錯過了什么?
您需要在基類上使用ProtoInclude
屬性:
[ProtoContract]
[ProtoInclude(500, typeof(SubClass1 ))]
public class BaseClass
{
id arg(上例中為500)對於該類應該是唯一的。 有關更多信息,請參閱此文章
我知道它已經很老了,但可能對某人有所幫助。 在某些情況下,您可以通過重新定義子類型中的基本屬性來解決此問題:
[ProtoContract]
public class SubClass1 : BaseClass
{
[ProtoMember(1)]
public string BaseName
{
get{return base.Name;}
set{base.Name = value;}
}
...
[ProtoMember(3)]
public string Town
{
get; set;
}
[ProtoMember(4)]
public Sex Sex
{
get; set;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.