【问题标题】:ProtoBuf is not serializing a field in inherited class [duplicate]ProtoBuf 没有序列化继承类中的字段[重复]
【发布时间】: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&lt;T&gt; 定义:

[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&lt;T&gt; 中,它不包含在ProtoInclude 列表本身中,但它的子类包含。我无法将PrivilegeEnumLike&lt;&gt; 添加到ProtoInclude 列表中,因为我认为这没有意义。

【问题讨论】:

    标签: c# protobuf-net


    【解决方案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>
    

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

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 2012-10-10
      • 1970-01-01
      相关资源
      最近更新 更多