我快速地搜索了一下oneof在Protobuf-net中的用法,它看起来是支持2.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中的这个MS示例相同的功能?在编写类本身和确定最终参数的具体类型方面?
发布于 2021-10-20 14:28:13
处理这个问题的方法是从您引用的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应该使用枚举“选项(奇怪的是,下面是"Options"),如果启用了该选项,还会添加:
public InstrumentOneofCase InstrumentCase => (InstrumentOneofCase)__pbn__instrument.Discriminator;
public enum InstrumentOneofCase
{
None = 0,
Stock = 2,
Currency = 3,
}否则,您将不得不使用ShouldSerialize*()方法来解析活动案例。
希望这能澄清如何将oneof与protobuf结合使用。
https://stackoverflow.com/questions/69647655
复制相似问题