2017-07-20 7 views
0

protobuf-netはシリアル番号named tuplesをサポートしていますか?protobuf-netは名前付きタプルをサポートしていますか?

例えば

[ProtoMember(1)] 
protected readonly SortedDictionary<double, (double Bid, double Ask, double Open, double High, double Low, double Close, int Volume, int OpenInt)> FuturesCurveData; 
+0

これらの投票には、この質問と異なる点はありません。https://stackoverflow.com/questions/4763875/does-protobuf-net-support-nullable-types – screig

+0

その質問には@​​screigというコードが含まれています。あなたの質問にいくつかのコードを追加できますか? – mjwills

+0

@mjwillsそこに行く – screig

答えて

3

"部分的にはい、一部はありません"。

いるProtobuf-netは名前のタプルのない特定の知識を持っていない、とthe names are not available to library codeが、以降はバージョン2.2.0から、いるProtobufネットは、基本的に、位置の種類として扱い、ValueTuple<...>種類の契約を推測することができます - Bidはフィールド1、Askはフィールド2などとなります。GetProto<T>のようなコードはではありません。は期待通りの結果をもたらします(a:名前を見ることができず、b:形状が大きくタプル)、細かいシリアル化の詳細(DataFormatなど)を制御することはできませんが、それはうまくいくはずです。

次は正常に動作します:

using ProtoBuf; 
using System.Collections.Generic; 

static class P 
{ 
    static void Main() 
    { 
     var obj = new MyType { FuturesCurveData = { 
       { 1.0, (1, 2, 3, 4, 5, 6, 7, 8) }, 
       { 2.0, (2, 3, 4, 5, 6, 7, 8, 9) }, 
      } }; 
     var clone = Serializer.DeepClone(obj); 
     foreach(var pair in clone.FuturesCurveData) 
     { 
      System.Console.WriteLine($"{pair.Key}: {pair.Value}"); 
     } 
    } 
} 
[ProtoContract] 
class MyType 
{ 
    [ProtoMember(1)] 
    public SortedDictionary<double, (double Bid, double Ask, double Open, double High, double Low, double Close, int Volume, int OpenInt)> FuturesCurveData { get; } = 
    new SortedDictionary<double, (double Bid, double Ask, double Open, double High, double Low, double Close, int Volume, int OpenInt)>(); 
} 

出力:

1: (1, 2, 3, 4, 5, 6, 7, 8) 
2: (2, 3, 4, 5, 6, 7, 8, 9) 

そして、ここではGetProto<MyType>()が生み出すものだ - ではない、非常にそのような成功:サイドノートとして

syntax = "proto2"; 
package System; 

message KeyValuePair_Double_ValueTuple_Double_Double_Double_Double_Double_Double_Int32_ValueTuple_Int32 { 
    optional double Key = 1; 
    optional ValueTuple_Double_Double_Double_Double_Double_Double_Int32_ValueTuple_Int32 Value = 2; 
} 
message MyType { 
    repeated KeyValuePair_Double_ValueTuple_Double_Double_Double_Double_Double_Double_Int32_ValueTuple_Int32 FuturesCurveData = 1; 
} 
message ValueTuple_Double_Double_Double_Double_Double_Double_Int32_ValueTuple_Int32 { 
    optional double Item1 = 1; 
    optional double Item2 = 2; 
    optional double Item3 = 3; 
    optional double Item4 = 4; 
    optional double Item5 = 5; 
    optional double Item6 = 6; 
    optional int32 Item7 = 7; 
    optional ValueTuple_Int32 Rest = 8; 
} 
message ValueTuple_Int32 { 
    optional int32 Item1 = 1; 
} 

、それとなります。map<,>キーの種類がintまたはstringの場合、バグが発生した可能性があります(I have logged)。

+0

ありがとうMarc!私はすべてのシナリオをカバーするとは思っていません。したがって、あなたの詳細で有益な返答に感謝します。ショーン – screig

関連する問題