当其父继承自IList<>时,无法序列化属性

时间:2013-04-29 01:46:47

标签: serialization protobuf-net

我对继承自IList<string>Family类使用以下数据结构:

public class Family : IList<string>
{
    public string LastName { get; set; }

   //IList<string> members
              .                .
              .

   //IList<string> members
}

我创建了自己的RuntimeTypeModel并将Family类型添加到其中,如下所示:

RuntimeTypeModel myModel = RuntimeTypeModel.Create();
MetaType familyMetaType = myModel.Add(typeof(Family), true);
familyMetaType.AddField(1, "LastName");
familyMetaType.AddField(2, "Item").IsPacked = true; ;
familyMetaType.CompileInPlace();
myModel.Compile();

然后我创建一个Family对象并序列化它:

Family family = new Family();
family.LastName = "Sawan";
family.Add("Amer");

using (FileStream fs = new FileStream("Dump.proto", FileMode.Create))
    myModel.Serialize(fs, family);

但是当我反序列化它时,我只获得string集合的成员而不是LastName值。

我应该将RuntimeTypeModel设置为什么配置,以使其序列化其他对象,例如本例中的LastName

1 个答案:

答案 0 :(得分:2)

XmlSerializer和其他几个人一样,protobuf-net在列表和实体之间划清界限。就protobuf-net而言,某些东西不可能同时存在。如果您不希望它选择“列表”,则可以在IgnoreListHandling上使用[ProtoContract](IIRC) - 但这显然不会序列化的项目列表。通常最好是具有名称且具有列表的对象:

[ProtoContract]
public class Family
{
    [ProtoMember(1)] public string LastName { get; set; }
    [ProtoMember(2)] public IList<string> Items {get{return items;}}

    private readonly IList<string> items = new List<string>();
}