我有一個使用protobuf-net進行繼承的具體用例,我還沒有找到它在這裏覆蓋(儘管很樂意被重定向到任何有用的答案) 。protobuf-net:deserialise將關鍵字擴展到繼承層次結構
我必須從第三方protobuf源(GTFS-RT)反序列化一些對象,並且提供的.proto使用關鍵字extend
來擴展基類型(我們也使用其他提要),這從客觀角度來看似乎是明智的。但是,我無法獲得protobuf-net將這種格式的提要反序列化爲適當的繼承層次結構。
例如,鹼.proto限定FeedHeader
(被叫transit_realtime
包下):
message FeedHeader {
required string gtfs_realtime_version = 1;
enum Incrementality {
FULL_DATASET = 0;
DIFFERENTIAL = 1;
}
optional Incrementality incrementality = 2 [default = FULL_DATASET];
optional uint64 timestamp = 3;
extensions 1000 to 1999;
}
第三方延伸FeedHeader
到包括另一屬性:
extend transit_realtime.FeedHeader {
optional NyctFeedHeader nyct_feed_header = 1001;
}
我想將其解串爲以下類的層次結構:
namespace Base.GTFS
{
[ProtoContract(Name = nameof(FeedHeader))]
public class FeedHeader
{
[ProtoMember(1, IsRequired = true, Name = nameof(gtfs_realtime_version), DataFormat = DataFormat.Default)]
public string gtfs_realtime_version { get; set; }
[ProtoMember(2, IsRequired = false, Name = nameof(incrementality), DataFormat = DataFormat.TwosComplement)]
[DefaultValue(Incrementality.FULL_DATASET)]
public Incrementality incrementality { get; set; } = Incrementality.FULL_DATASET;
[ProtoMember(3, IsRequired = false, Name = nameof(timestamp), DataFormat = DataFormat.TwosComplement)]
[DefaultValue(default(ulong))]
public ulong timestamp { get; set; } = default(ulong);
public FeedHeader() { }
#region Nested Enums
[ProtoContract(Name = nameof(Incrementality))]
public enum Incrementality
{
[ProtoEnum(Name = nameof(FULL_DATASET), Value = 0)]
FULL_DATASET = 0,
[ProtoEnum(Name = nameof(DIFFERENTIAL), Value = 1)]
DIFFERENTIAL = 1
}
#endregion
}
}
namespace Other.GTFS
{
[ProtoContract(Name = nameof(FeedHeader))]
public class FeedHeader : Base.GTFS.FeedHeader
{
/// <summary>
/// NYCT Subway extensions for the feed header
/// </summary>
[ProtoMember(1001, Name = nameof(nyct_feed_header), IsRequired = false, DataFormat = DataFormat.Default)]
public NyctFeedHeader nyct_feed_header { get; set; } = null;
public FeedHeader() : base() { }
}
}
通過閱讀其他帖子在這裏和其他地方後,我試圖使用AddSubType
方法和AddSurrogate
方法,但發現我只能可靠地讓所有字段反序列化,如果我覆蓋基類中的所有字段。這看起來非常低效,並且如果(和何時)基本類型改變將會中斷。我們還需要將serialise用於其他提要的基本類型,所以我需要一個易於擴展的解決方案。
有誰知道任何方式來支持這種情況下,或有任何建議可能有幫助嗎?
感謝您的信息 - 我認爲這幾乎是如何工作的。這是一個恥辱,因爲我有一個服務層位於聲明一個使用基類的接口之上 - 我想我需要將基礎模型的必需部分提取到接口中,並確保它們得到應用到部分生成的類(更容易看到,因爲它們是部分)。 – davide