在某些情况下,带有继承的protobuf-net序列化不起作用
本文关键字:继承 protobuf-net 序列化 不起作用 情况下 | 更新日期: 2023-09-27 18:01:14
我目前正在使用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));
现在序列化基类工作正常,List被正确地序列化了:
// 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)
对此有什么想法吗?太好了,因为我不知道。
有两种方法对我有效:
-
你必须在你的基类上使用protobuf网络中的ProtoInclude属性:
[DataContract] [ProtoInclude(3, typeof(ResultOfMyDtos))] public class BaseClass<T> { // ... [cut] ... }
-
如果由于派生类在这一点/库不可用而不可能,或者这不可能在基类的这个点/库使用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; } }