c# – protobuf-net忽略[KnownType]并要求添加ProtoInclude
发布时间:2020-12-15 21:24:09 所属栏目:百科 来源:网络整理
导读:使用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
使用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字段未序列化. 为了使它工作,我必须用以下内容装饰消息: [ProtoInclude(1,typeof(LoginRequest))] 为什么是这样?我读过this similar question,但Marc得出结论“在v2中不再需要这个 – 你可以在运行时指定它,或者使用DynamicType” 我不想指定除KnownType之外的任何其他内容 解决方法
[KnownType(…)]是不够的,因为库还需要一个唯一的(用于该类型)整数来用作键(示例中为1).推断它qutomatically风险太大,因为它可能会在调整类型时导致意外中断(版本安全性是一个非常刻意的设计目标).
如果您不想为此添加属性,可以告诉它在运行时需要什么,即(在您的启动代码中): RuntimeTypeModel.Default[typeof(Message)] .AddSubType(1,typeof(LogonRequest)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |