解决这个问题的方法是从你引用的 MS 示例中获取消息,并通过 protogen 运行它以查看它的作用——我们可以在这里非常方便地做到这一点:https ://protogen.marcgravell.com/ (注意我'syntax = "proto3";
在文件顶部添加,在 MS 示例中省略)。
这给了我们,除其他外:
[global::ProtoBuf.ProtoMember(2, Name = @"stock")]
public Stock Stock
{
get => __pbn__instrument.Is(2) ? ((Stock)__pbn__instrument.Object) : default;
set => __pbn__instrument = new global::ProtoBuf.DiscriminatedUnionObject(2, value);
}
public bool ShouldSerializeStock() => __pbn__instrument.Is(2);
public void ResetStock() => global::ProtoBuf.DiscriminatedUnionObject.Reset(ref __pbn__instrument, 2);
private global::ProtoBuf.DiscriminatedUnionObject __pbn__instrument;
[global::ProtoBuf.ProtoMember(3, Name = @"currency")]
public Currency Currency
{
get => __pbn__instrument.Is(3) ? ((Currency)__pbn__instrument.Object) : default;
set => __pbn__instrument = new global::ProtoBuf.DiscriminatedUnionObject(3, value);
}
public bool ShouldSerializeCurrency() => __pbn__instrument.Is(3);
public void ResetCurrency() => global::ProtoBuf.DiscriminatedUnionObject.Reset(ref __pbn__instrument, 3);
所以我们可以看到它基本上是使用建立在类型之上的条件序列化DiscriminatedUnionObject
。实际上有一堆相关的类型被命名DiscriminatedUnion*
- 取决于你需要重叠的内容,但因为它们都是这里的消息类型:DiscriminatedUnionObject
为我们工作。
还有一个可选的“oneof
应该使用枚举”选项(奇怪的是,“选项”下),如果启用,还会添加:
public InstrumentOneofCase InstrumentCase => (InstrumentOneofCase)__pbn__instrument.Discriminator;
public enum InstrumentOneofCase
{
None = 0,
Stock = 2,
Currency = 3,
}
否则,您将不得不使用这些ShouldSerialize*()
方法来解决活动案例。
希望这oneof
能阐明如何与 protobuf-net 一起使用。