Protobuf-net -如何使用其中之一



我对Protobuf-netoneof的用法做了一个快速的搜索,它似乎在v2.3.0中得到了支持,但是我找不到任何关于如何使用的例子!

我的要求很简单,也许这也可以用[ProtoInclude]来解决,但我不太确定这将如何工作。我有以下类:

[ProtoContract]
public class ProgressUIMessage
{
[ProtoMember(1)]
public int Id {get; set;}
[ProtoMember(2)]
public object Message {get; set;}
}

其中Message可以是8种已知类型中的1种。这些类型并不相互继承,尽管代码可以更改,但所有类型没有任何共同之处。

使用Google.Protobuf我希望做类似的事情,在这里我有一个名为Instrument的属性,可以是上面示例中的两种类型之一,然后使用InstrumentOneofCase来找出我给出的类型。但是我如何在Protobuf-net中实现同样的事情呢?

编辑:我将保留最初的问题,但也许一个更好的问题是,更多的人可以联系到:你如何在Protobuf-net中实现与MS示例相同的事情?无论是在编写类本身方面,还是在确定最终参数的具体类型方面?

处理这个问题的方法是从您引用的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应该使用enum"选项(在:"Options"下),如果启用,还会添加:

public InstrumentOneofCase InstrumentCase => (InstrumentOneofCase)__pbn__instrument.Discriminator;
public enum InstrumentOneofCase
{
None = 0,
Stock = 2,
Currency = 3,
}

如果没有这个,您将不得不使用ShouldSerialize*()方法来解决活动情况。

希望这能澄清oneof如何与protobuf-net一起使用。

最新更新