我有一个使用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