私はこのクラスを持っています
[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 プロパティの型を float から decimal に変更したところ、この行に例外メッセージが表示されました
Serializer.Serialize(stream, toSerialize);
例外メッセージは言う
IExtensible は、継承のある構造体またはクラスではサポートされていません
何も変更せずに float を decimal にしたため、エラー メッセージ自体が紛らわしいです。その変更がこの例外メッセージの理由になる可能性はありますか? また、問題の原因を理解するには、何を確認すればよいですか?
.net 4.0でprotobuf-net v.2.0.0.664を使用しています
編集
Marc のコメントに関して、MarketDataEntry は別のプロトコントラクトの基本クラスです。
[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
したがって、実際にシリアル化されているのは、ProtobufMarketData から継承する MarketData のインスタンスであり、これには List 型のプロパティが含まれているため、そこに問題があると思います。decimal プロパティを含む 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; }
}
}