首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Protobuf-net -如何使用

Protobuf-net -如何使用
EN

Stack Overflow用户
提问于 2021-10-20 14:14:16
回答 1查看 986关注 0票数 1

我快速地搜索了一下oneofProtobuf-net中的用法,它看起来是支持2.3.0版,但在我的一生中,我找不到任何关于如何使用它的例子!

我的需求非常简单,也许这也可以用[ProtoInclude]解决,但我不太确定这将如何工作。我有以下课程:

代码语言:javascript
复制
[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示例相同的功能?在编写类本身和确定最终参数的具体类型方面?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-20 14:28:13

处理这个问题的方法是从您引用的MS示例中获取消息,并通过protogen来查看它所做的事情--我们在这里可以非常方便地这样做:https://protogen.marcgravell.com/ (注意,我在文件的顶部添加了syntax = "proto3";,在MS示例中省略了这一点)。

这给了我们,除其他外:

代码语言:javascript
复制
    [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"),如果启用了该选项,还会添加:

代码语言:javascript
复制
    public InstrumentOneofCase InstrumentCase => (InstrumentOneofCase)__pbn__instrument.Discriminator;

    public enum InstrumentOneofCase
    {
        None = 0,
        Stock = 2,
        Currency = 3,
    }

否则,您将不得不使用ShouldSerialize*()方法来解析活动案例。

希望这能澄清如何将oneof与protobuf结合使用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69647655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档