protobuf-net忽略[KnownType]并要求添加ProtoInclude
本文关键字:添加 ProtoInclude 忽略 KnownType protobuf-net | 更新日期: 2023-09-27 18:10:06
using protobuf-net.dll 2.0.0.431
我正在尝试使用[DataContract]和[DataMember]序列化类层次结构。
[DataContract]
[KnownType(typeof(LoginRequest))]
public class Message
{
[DataMember(Order = 2)]
public int Id { get; set; }
}
[DataContract]
public class LoginRequest : Message
{
[DataMember(Order = 1)]
public string Username { get; set; }
[DataMember(Order = 2)]
public string Password { get; set; }
}
和序列化/反序列化:
using (var file = File.Create(filename))
{
Serializer.Serialize(file, loginRequest);
}
LoginRequest deserialized;
using (var file = File.OpenRead(filename))
{
deserialized = Serializer.Deserialize<LoginRequest>(file);
}
ReflectionUtils.Compare(loginRequest, deserialized);
抽象类Message
的Id
字段没有被序列化
要使它工作,我必须用:
装饰Message[ProtoInclude(1, typeof(LoginRequest))]
为什么会这样?我读过这个类似的问题,但Marc得出结论:"这在v2中不再需要了——你可以在运行时指定它,或者使用DynamicType"
我宁愿不指定任何额外的KnownType
[KnownType(...)]
是不够的,因为库还需要一个唯一的(对于该类型)整数用作键(示例中的1
)。自动推断它的风险太大,因为它可能在调整类型时导致意外的中断(版本安全是一个非常深思熟虑的设计目标)。
如果你不想为this添加属性,你可以告诉它在运行时需要什么,即(在你的启动代码中):
RuntimeTypeModel.Default[typeof(Message)]
.AddSubType(1, typeof(LogonRequest));