protobuf-net v2 r450继承

3

protobuf-net v2 r450 继承

希望有人能够帮助指导我在使用 protobuf-net 时的正确方向。所有我能找到的示例代码似乎都表明我所尝试的应该是可行的。

领域模型(我的最终领域模型将比这个更复杂,但我甚至无法让它工作):

[ProtoContract]
public class GeographyData
{
    [ProtoMember(1)]
    public DateTime LastRefreshTime { get; set; }

    [ProtoMember(2, AsReference = true, IsRequired = true)]
    public GeographyItem Item { get; set; }
}

[ProtoContract]
[ProtoInclude(3, typeof(HotelData))]
public class GeographyItem
{
    [ProtoMember(1)]
    public Guid Id { get; set; }

    [ProtoMember(2)]
    public string Name { get; set; }
}

[ProtoContract]
public class HotelData : GeographyItem
{
}

测试:

var geographyDataTest = new GeographyData();
geographyDataTest.LastRefreshTime = DateTime.Now;
geographyDataTest.Item = new HotelData
{
    Id = Guid.Empty,
    Name = "Test",
};

var test = ProtoBuf.Serializer.DeepClone(geographyDataTest);

异常:

无法将类型为“Domain.Geography.GeographyItem”的对象转换为类型“Domain.Geography.HotelData”。

[InvalidCastException: Unable to cast object of type 'Domain.Geography.GeographyItem' to type 'Domain.Geography.HotelData'.]
   proto_14(Object , ProtoReader ) +2638
   ProtoBuf.Serializers.CompiledSerializer.ProtoBuf.Serializers.IProtoSerializer.Read(Object value, ProtoReader source) in C:\Dev\protobuf-net\protobuf-net\Serializers\CompiledSerializer.cs:49
   ProtoBuf.Meta.RuntimeTypeModel.Deserialize(Int32 key, Object value, ProtoReader source) in C:\Dev\protobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs:413
   ProtoBuf.ProtoReader.ReadTypedObject(Object value, Int32 key, ProtoReader reader, Type type) in C:\Dev\protobuf-net\protobuf-net\ProtoReader.cs:534
   ProtoBuf.BclHelpers.ReadNetObject(Object value, ProtoReader source, Int32 key, Type type, NetObjectOptions options) in C:\Dev\protobuf-net\protobuf-net\BclHelpers.cs:428
   proto_2(Object , ProtoReader ) +688
   ProtoBuf.Serializers.CompiledSerializer.ProtoBuf.Serializers.IProtoSerializer.Read(Object value, ProtoReader source) in C:\Dev\protobuf-net\protobuf-net\Serializers\CompiledSerializer.cs:49
   ProtoBuf.Meta.RuntimeTypeModel.Deserialize(Int32 key, Object value, ProtoReader source) in C:\Dev\protobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs:413
   ProtoBuf.Meta.TypeModel.DeepClone(Object value) in C:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:1034
   ProtoBuf.Serializer.DeepClone(T instance) in C:\Dev\protobuf-net\protobuf-net\Serializer.cs:46

有人能给我提供一些指引吗?

谢谢


同意,看起来它“应该”工作。我现在没在电脑边,稍后会看一下。 - Marc Gravell
1个回答

2

谢谢马克的快速回复,非常感谢!确实,如果我删除AsReference,它就可以正常工作了。可惜,我真的很想要这个功能 :) - David McMinn
@David 如果你需要的话,我可以在几天内看一下这个。 - Marc Gravell
那会很棒,但我知道开发库的痛苦,突然间所有人都想让它们为自己的工作服务 :) 所以不要劳累过度,我肯定会找到另一个解决方案的 :) - David McMinn
@david 这是一个应该被支持的场景。 - Marc Gravell
@MarcGravell 你有机会修复这个问题吗? - arathorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接