我對oneofin的用法進行了快速搜索Protobuf-net,似乎從 v2.3.0 開始就支持它,但是我一生都找不到任何關于如何使用它的示例!
我的要求非常簡單,也許這也可以解決,[ProtoInclude]但我不太確定這到底是如何作業的。我有以下課程:
[ProtoContract]
public class ProgressUIMessage
{
[ProtoMember(1)]
public int Id {get; set;}
[ProtoMember(2)]
public object Message {get; set;}
}
哪里Message可以是 8 種不同的已知型別中的一種。這些型別根本不相互繼承,盡管可以更改代碼,但所有型別都沒有共同點。
使用Google.Protobuf我希望做類似的事情,其中我有一個屬性Instrument,它可以是上面示例中的兩種型別之一,然后用于InstrumentOneofCase確定給定的型別。但是我如何在Protobuf-net.
編輯: 我將保留原來的問題,但也許更多人能想到的一個更好的問題是:你將如何實作與Protobuf-net 中的這個 MS 示例相同的事情?無論是在撰寫類本身方面還是在確定引數最終是什么具體型別方面?
uj5u.com熱心網友回復:
解決這個問題的方法是從您參考的 MS 示例中獲取訊息,然后通過 protogen 運行它以查看它的作用 - 我們可以在這里非常方便地完成:https ://protogen.marcgravell.com/ (注意我'msyntax = "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 一起使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/327278.html
