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/