3

3レベルの継承グラフがあります。ProtoBuf 2.0.0.611

QueryRequest
VenueQueryRequest
VenueQueryRequestV1

すべてのマークが付いています

[DataContract, System.Serializable, ProtoBuf.ProtoContract]

QueryRequestには次のものが含まれます。

[ProtoInclude(10, typeof(VenueQueryRequest))]
[ProtoInclude(11, typeof(VenueQueryRequestV1))]

VenueQueryRequestV1に対してSerializeWithLengthPrefixを呼び出すと、「不明なサブタイプ:VenueQueryRequestV1」が表示されます。

電話をかける前に追加(置換ではない)した場合

RuntimeTypeModel.Default[typeof(QueryRequest)].AddSubType(10, typeof(VenueQueryRequest));
RuntimeTypeModel.Default[typeof(QueryRequest)].AddSubType(11, typeof(VenueQueryRequestV1));

「重複するフィールド番号が検出されました。10on:Designertech.AzureServices.Messages.QueryRequest」が表示されます。2番目のものだけを追加すると、同じエラーが発生しますが、10ではなく11になります。

交換すると元のエラーが発生します

これにより、サブタイプについて知っている必要があるように見えます

キャストやどこかで物事を台無しにする可能性はありますか?現時点では、基本クラスのみにプロパティが宣言されています。

[ProtoMember(1)]
IList<string> RequestedFields

これは私を狂わせています。

余談ですが、これはCloudFX AzureServiceBusフレームワークに送られるメッセージを生成するために使用されています。

4

1 に答える 1

4

各レベルは、直接サブタイプに通知する必要があるだけです。

[ProtoContract, ProtoInclude(10, typeof(VenueQueryRequest))
Class QueryRequest {...}

[ProtoContract, ProtoInclude(11, typeof(VenueQueryRequestV1))
Class VenueQueryRequest : QueryRequest {...}

[ProtoContract]
class VenueQueryRequestV1 : VenueQueryRequest {...}
于 2012-12-09T20:34:38.157 に答える