我有这门课
[global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"MarketDataEntry")]
public partial class MarketDataEntry : global::ProtoBuf.IExtensible
{
// some other properties
private float _EntryPrice;
[global::ProtoBuf.ProtoMember(270, IsRequired = true, Name=@"EntryPrice", DataFormat = global::ProtoBuf.DataFormat.FixedSize)]
public float EntryPrice
{
get { return _EntryPrice; }
set { _EntryPrice = value; }
}
}
这按预期工作。我将 EntryPrice 属性的类型从浮点数更改为小数,现在我在这一行收到异常消息
Serializer.Serialize(stream, toSerialize);
异常消息说
具有继承的结构或类不支持 IExtensible
错误消息本身令人困惑,因为我没有做任何更改,而是浮动到十进制。这种变化可以成为此异常消息的原因吗?我应该检查什么来了解问题来自哪里?
我在 .net 4.0 上使用 protobuf-net v.2.0.0.664
编辑
关于 Marc 的评论,MarketDataEntry 是另一个 protocontract 的基类。
[Serializable]
[ProtoContract]
public sealed class MarketData : ProtobufMarketData, IEntity
{
[ProtoMember(1)]
public long Id { get; set; }
[ProtoMember(2)]
public DateTime TransformTime { get; set; }
[ProtoMember(3)]
public DateTime CreationTime { get; set; }
[ProtoMember(4)]
public DateTime ConsumtionTime { get; set; }
[ProtoMember(5)]
public int FailedToBeConsumedCounter { get; set; }
}
编辑 2
所以实际上被序列化的是 MarketData 的实例,它继承自 ProtobufMarketData,而 ProtobufMarketData 又包含 List 类型的属性,所以我认为这就是问题所在。MarketDataEntry 对象列表,其中包含小数属性。
[global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"ProtoBufMarketData")]
[ProtoBuf.ProtoInclude(10000, typeof(MarketData))]
public partial class ProtoBufMarketData : global::ProtoBuf.IExtensible
{
public ProtoBufMarketData() {}
private readonly global::System.Collections.Generic.List<CoreX.Shared.Entities.MarketDataDefs.MarketDataEntry> _MarketDataEntries = new global::System.Collections.Generic.List<CoreX.Shared.Entities.MarketDataDefs.MarketDataEntry>();
[global::ProtoBuf.ProtoMember(10004, Name = @"MarketDataEntries", DataFormat = global::ProtoBuf.DataFormat.Default)]
public global::System.Collections.Generic.List<CoreX.Shared.Entities.MarketDataDefs.MarketDataEntry> MarketDataEntries
{
get { return _MarketDataEntries; }
}
}