【发布时间】:2016-11-08 07:13:13
【问题描述】:
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 {
}
我仍然发现 serialize BaseClass / deserialize DerivedClass 抛出相同的 System.InvalidCastException
如果我反序列化为object 类型的引用(而不是DerivedClass),则基础类型为BaseClass。这解释了强制转换异常,但提出了一个问题,为什么 ProtoBuf.Serializer.Deserialize<DerivedClass>() 反序列化为 BaseClass 类型的对象?
【问题讨论】:
标签: c# inheritance overriding virtual protobuf-net