protobuf-net proto2 c#

我有一个派生类,它通过隐藏对应的同名基类属性来重新定义类型。

我希望序列化一个基类实例并反序列化为派生类型:

[ProtoBuf.ProtoContract(Name=@"BaseClassProto")]
[ProtoBuf.ProtoInclude(typeof(DerivedClass), 1000)]
public partial class BaseClass {
  [ProtoBuf.ProtoMember(1, IsRequired = false, Name = @"MyProperty", DataFormat = ProtoBuf.DataFormat.TwosComplement)]
  public int MyProperty { get; set; }
}

[ProtoBuf.ProtoContract(Name=@"DerivedClassProto")]
public partial class DerivedClass : BaseClass {
  [ProtoBuf.ProtoMember(1, IsRequired = false, Name = @"MyProperty", DataFormat = ProtoBuf.DataFormat.TwosComplement)]
  public new MyEnum MyProperty { get; set; }
  }
}

public class Test {
  var baseObject = new BaseClass{ TestString = "TestBaseObject", TestInt = 1 };

  DerivedClass derivedObject;
  using (var stream = new MemoryStream())
  {
    ProtoBuf.Serializer.Serialize(stream, baseObject);
    Debug.WriteLine(stream.Length);
    stream.Seek(0, SeekOrigin.Begin);
    derivedObject = ProtoBuf.Serializer.Deserialize<DerivedClass>(stream);
  }
}



  类型“ System.InvalidCastException”的异常发生在
  protobuf-net.dll,但未在用户代码中处理
  附加信息:无法转换类型的对象
  'BaseClass'键入'DerivedClass'。


为什么protobuf-net尝试将BaseClass强制转换为DerivedClass

protobuf-net是否不应该按照DerivedClass中的原始注释将消息直接反序列化为DerivedClass

隐藏BaseClass.IntProperty还会隐藏ProtoMember注释吗?从而允许在proto index 1中重新定义DerivedClass

编辑以添加其他信息:

尝试最小可行的测试用例,即使我将DerivedClass重新定义为尽可能简单:

[ProtoBuf.ProtoContract(Name=@"DerivedClassProto")]
public partial class DerivedClass : BaseClass {
}


我仍然发现序列化BaseClass /反序列化DerivedClass会抛出相同的System.InvalidCastException

此外,如果我反序列化为object类型的引用(而不是DerivedClass),则基础类型为BaseClass。这解释了强制转换异常,但提出了一个问题,为什么ProtoBuf.Serializer.Deserialize<DerivedClass>()反序列化为类型为BaseClass的对象?

最佳答案

protobuf-net中不同级别的层次结构是.proto术语中的单独消息。子类的标签独立于基类中的标签。重用标签并不是关卡之间的概念。我很惊讶所显示的代码实际上完全起作用,因为这似乎在一个级别中两次使用了标记1(一次用于子类型,一次用于属性-都在MyBaseType上)。这可能是造成混乱的错误的原因。

关于c# - protobuf-net继承:派生类隐藏基类属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40480996/

10-10 03:54