protobuf-net 是否支持命名元组?

scr*_*eig 2 c# protocol-buffers protobuf-net

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;
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

“部分是,部分不是”。

protobuf网有没有具体的知识命名元组,和名字都没有提供给库代码,而是从V2.2.0起,protobuf网能够推断出对合同ValueTuple<...>类型,基本上是把它当作一个位置类型-这样Bid会在现场1,Ask将现场2,等等一些类似的代码GetProto<T>不会产生预期的结果(因为:它不能看到的名字,和b:形状变得非常古怪的大元组),和你赢了” t 能够控制细粒度的序列化细节(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)>();
}
Run Code Online (Sandbox Code Playgroud)

输出:

1: (1, 2, 3, 4, 5, 6, 7, 8)
2: (2, 3, 4, 5, 6, 7, 8, 9)
Run Code Online (Sandbox Code Playgroud)

这就是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;
}
Run Code Online (Sandbox Code Playgroud)

作为旁注,如果键类型是或,它应该可以工作,但它似乎遇到了一个错误,我已经记录了.map<,>intstring