ProtoBuf没有序列化继承类中的字段

时间:2016-03-14 23:14:08

标签: c# protobuf-net

我有一个名为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 个答案:

答案 0 :(得分:1)

以下是规则:

必须正确实现类层次结构。 这意味着您需要在类上使用ProtoInclude,不一定是基础 否则,子类和基类之间的任何继承类都将 not 序列化。

我做了什么:

基类:

[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>

现在一切正常。 如果有更好的解决方案,请告诉我。