gpt4 book ai didi

c# - protobuf-net 继承 : derived class hides base class property

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:11 31 4
gpt4 key购买 nike

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);
}
}

An exception of type 'System.InvalidCastException' occurred in protobuf-net.dll but was not handled in user code Additional information: Unable to cast object of type 'BaseClass' to type 'DerivedClass'.

为什么是protobuf-net试图投 BaseClassDerivedClass

不应该protobuf-net只需将消息直接反序列化为 DerivedClass根据 DerivedClass 中的原型(prototype)注释?

也隐藏 BaseClass.IntProperty也隐藏它的 ProtoMember注释?从而允许 proto index 1DerivedClass 中重新定义?

编辑以添加其他信息:

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

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

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

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

最佳答案

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

关于c# - protobuf-net 继承 : derived class hides base class property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40480996/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com