【问题标题】:protobuf-net serialization with inheritance does not work in some cases在某些情况下,带有继承的 protobuf-net 序列化不起作用
【发布时间】:2015-07-06 23:32:03
【问题描述】:

我目前正在努力使用 protobuf-net 来正确序列化我的类。

我有以下类结构

[DataContract]
public class BaseClass<T>
{
    [DataMember(Order = 1)]
    public bool IsOk { get; set; }

    [DataMember(Order = 2)]
    public List<T> Results { get; set; }
}

[DataContract]
public class MyDto
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
}

[DataContract]
public class ResultOfMyDtos : BaseClass<MyDto>
{
    [DataMember(Order = 3)]
    public string Validation { get; set; }
}

我正在注册这样的子类型:

RuntimeTypeModel.Default.Add(typeof(BaseClass<MyDto>), true);
RuntimeTypeModel.Default.Add(typeof(ResultOfMyDtos), true);
RuntimeTypeModel.Default[typeof(BaseClass<MyDto>)].AddSubType(1000, typeof(ResultOfMyDtos));

现在序列化基类工作正常,列表已正确序列化:

// Works
var test1 = new BaseClass<MyDto>() { Results = new List<MyDto> { new MyDto { Name = "1" } } };
Serializer.Serialize(ms, test1)

继承根本不起作用,我只看到“IsOk”布尔值:

// Does not return anything but the "IsOk" property
var test2 = new ResultOfMyDtos<MyDto>() { Validation = "Xy", Results = new List<MyDto> { new MyDto { Name = "1" } } };
  Serializer.Serialize(ms, test2)

对此有什么想法吗?会很好,因为我不知道。

【问题讨论】:

  • 写入文件并查看文件: StreamWriter writer = new StreamWriter(FILENAME); serializer.Serialize(writer, test1); writer.Flush(); writer.Close();

标签: c# serialization protocol-buffers protobuf-net


【解决方案1】:

有两种方法对我有用:

  1. 您必须在基类上使用来自 protobuf-net 的 ProtoInclude 属性:

    [DataContract]
    [ProtoInclude(3, typeof(ResultOfMyDtos))]
    public class BaseClass<T>
    {
        // ... [cut] ...
    }
    
  2. 如果由于此时派生类/库不可用而无法使用,或者此时无法使用 protobuf-net/基类的库(例如,我有),您可以重新定义子类的属性:

    [DataContract]
    public class ResultOfMyDtos : BaseClass<MyDto>
    {
        [DataMember(Order = 1)]
        public new bool IsOk
        {
            get { return base.IsOk; }
            set { base.IsOk = value; }
        }
    
        [DataMember(Order = 2)]
        public new List<MyDto> Results
        {
            get { return base.Results; }
            set { base.Results = value; }
        }
    
        [DataMember(Order = 3)]
        public string Validation { get; set; }
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2018-11-28
    • 2011-09-04
    相关资源
    最近更新 更多