ProtoBuf 未序列化继承 class 中的字段
ProtoBuf is not serializing a field in inherited class
我有一个名为 PrivilegeType
的基础 class,它被其他各种 class 继承。
一切正常,除了一个名为 PossibleValues
的特定字段,它没有得到 serialized/deserialized 好。
基本 class 定义:
[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
列表本身中,但它的子 class 是。我无法将 PrivilegeEnumLike<>
添加到 ProtoInclude
列表,因为我认为它没有意义。
规则如下:
Class 层次结构必须正确实施。
这意味着您需要在 parent classes 上使用 ProtoInclude
,不一定 base classes
否则,您的 subclass 和 baseclass 之间的任何继承 class 都将 而不是 序列化。
我做了什么:
基础class:
[ProtoContract]
[ProtoInclude(12, typeof(PrivilegeEnumLike<PrivilegeEnumValue>))]
[ProtoInclude(13, typeof(PrivilegeEnumLike<PrivilegeEnumValue[]>))]
public abstract class PrivilegeType
中间class:
[ProtoContract]
[ProtoInclude(20, typeof(PrivilegeEnum))]
[ProtoInclude(21, typeof(PrivilegeEnumSet))]
public abstract class PrivilegeEnumLike<T> : PrivilegeType<T>
现在一切正常。
如果有更好的解决方案,请告诉我。
我有一个名为 PrivilegeType
的基础 class,它被其他各种 class 继承。
一切正常,除了一个名为 PossibleValues
的特定字段,它没有得到 serialized/deserialized 好。
基本 class 定义:
[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
列表本身中,但它的子 class 是。我无法将 PrivilegeEnumLike<>
添加到 ProtoInclude
列表,因为我认为它没有意义。
规则如下:
Class 层次结构必须正确实施。
这意味着您需要在 parent classes 上使用 ProtoInclude
,不一定 base classes
否则,您的 subclass 和 baseclass 之间的任何继承 class 都将 而不是 序列化。
我做了什么:
基础class:
[ProtoContract]
[ProtoInclude(12, typeof(PrivilegeEnumLike<PrivilegeEnumValue>))]
[ProtoInclude(13, typeof(PrivilegeEnumLike<PrivilegeEnumValue[]>))]
public abstract class PrivilegeType
中间class:
[ProtoContract]
[ProtoInclude(20, typeof(PrivilegeEnum))]
[ProtoInclude(21, typeof(PrivilegeEnumSet))]
public abstract class PrivilegeEnumLike<T> : PrivilegeType<T>
现在一切正常。 如果有更好的解决方案,请告诉我。