3

我有一个 3 级继承图。ProtoBuf 2.0.0.611

QueryRequest
VenueQueryRequest
VenueQueryRequestV1

都标有

[DataContract, System.Serializable, ProtoBuf.ProtoContract]

查询请求包括:

[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));

我得到“检测到重复的字段编号;10 on:Designertech.AzureServices.Messages.QueryRequest”如果我只添加第二个,我会得到同样的错误,但是是 11 而不是 10。

如果我更换,我会得到原来的错误

这让我觉得它应该知道子类型

我是否可能会在某个演员或某处搞砸事情?目前,只有基类声明了任何属性。

[ProtoMember(1)]
IList<string> RequestedFields

这让我发疯了。

顺便说一句,这用于生成要馈送到 CloudFX Azure 服务总线框架的消息。

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 回答