ProtoBuf 没有序列化继承类中的字段[重复]
Posted
技术标签:
【中文标题】ProtoBuf 没有序列化继承类中的字段[重复]【英文标题】:ProtoBuf is not serializing a field in inherited class [duplicate] 【发布时间】:2016-03-14 23:14:08 【问题描述】:我有一个名为PrivilegeType
的基类,它被其他各种类继承。
一切正常,除了一个名为 PossibleValues
的特定字段没有很好地序列化/反序列化。
基类定义:
[ProtoContract]
[ProtoInclude(13, typeof(PrivilegeEnum))]
public abstract class PrivilegeType
...
PrivilegeEnum
定义:
[ProtoContract]
public class PrivilegeEnum : PrivilegeEnumLike<PrivilegeEnumValue>
...
PrivilegeEnumLike<T>
定义:
[ProtoContract]
public abstract class PrivilegeEnumLike<T> : PrivilegeType<T>
[ProtoMember(2)]
public Dictionary<string, PrivilegeEnumValue> PossibleValues;
...
PrivilegeEnumValue
定义:
[ProtoContract]
public class PrivilegeEnumValue
[ProtoMember(1)]
public string Value;
[ProtoMember(2)]
public string Text;
[ProtoMember(3)]
public HashSet<PrivilegeEnumValue> ImpliedValues = new HashSet<PrivilegeEnumValue>();
...
问题是,该字段定义在PrivilegeEnumLike<T>
中,它不包含在ProtoInclude
列表本身中,但它的子类包含。我无法将PrivilegeEnumLike<>
添加到ProtoInclude
列表中,因为我认为这没有意义。
【问题讨论】:
【参考方案1】:规则如下:
类层次结构必须正确实现。
这意味着您需要在 parent 类上使用 ProtoInclude
,而不必在 base 类上使用
否则,您的子类和基类之间的任何继承类不会被序列化。
我做了什么:
基类:
[ProtoContract]
[ProtoInclude(12, typeof(PrivilegeEnumLike<PrivilegeEnumValue>))]
[ProtoInclude(13, typeof(PrivilegeEnumLike<PrivilegeEnumValue[]>))]
public abstract class PrivilegeType
中产阶级:
[ProtoContract]
[ProtoInclude(20, typeof(PrivilegeEnum))]
[ProtoInclude(21, typeof(PrivilegeEnumSet))]
public abstract class PrivilegeEnumLike<T> : PrivilegeType<T>
现在一切正常。 如果有更好的解决方案,请告诉我。
【讨论】:
以上是关于ProtoBuf 没有序列化继承类中的字段[重复]的主要内容,如果未能解决你的问题,请参考以下文章
不支持 Protobuf-NET IExtensible 继承的解决方法
有没有办法在 protobuf-net 代理类中定义替代转换函数(从/到接口)