我有一个使用protobuf-net进行继承的特定用例,我还没有发现这里涵盖的(虽然很愿意被重定向到任何有用的答案)。
我必须从第三方protobuf feed(GTFS-RT)中反序列化一些对象,并且已提供的.proto使用extend
关键字扩展了基本类型(我们还在其他feeds中使用),从客观角度来看,这似乎是合理的。 但是,我无法让protobuf-net将以这种格式提供的feeds反序列化为适当的继承层次结构。
例如,基本.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
方法,但发现只有在覆盖基类中所有字段时才能可靠地对所有字段进行反序列化。这似乎非常低效,并且如果基本类型更改,则会出现问题。我们还需要将序列化用于其他源,因此我需要一个易于扩展的解决方案。是否有人知道如何支持这种情况或有任何建议?