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

Posted

技术标签:

【中文标题】protobuf-net 是不是支持命名元组?【英文标题】:Does protobuf-net support named tuples?protobuf-net 是否支持命名元组? 【发布时间】:2017-07-20 09:40:32 【问题描述】:

protobuf-net 是否支持named tuples 的序列化?

例如

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

【问题讨论】:

对于那些投反对票的人,请注意与这个问题没有什么不同***.com/questions/4763875/… 那个问题有代码@screig。你能在你的问题中添加一些代码吗? @mjwills 你去吧 当你尝试@screig 会发生什么? 在我围绕它写一整节课之前知道它会很方便。文档没有说。 【参考方案1】:

“部分是,部分不是”。

protobuf-net 没有关于命名元组的特定知识,the names are not available to library code,但从 v2.2.0 开始,protobuf-net 能够推断ValueTuple&lt;...&gt; 类型,本质上将其视为位置类型 - 所以 Bid 将是字段 1,Ask 将是字段 2,等等。像 GetProto&lt;T&gt; 这样的一些代码将不会产生结果您期望(因为 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&lt;MyType&gt;() 产生的结果——不太成功:

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;

附带说明,如果密钥类型为intstring,它应该作为map&lt;,&gt; 工作,但它似乎遇到了一个错误,即I have logged。

【讨论】:

谢谢马克!重新文档,我不希望它涵盖所有场景。因此,问题,再次感谢您的详细和有用的答复。肖恩

以上是关于protobuf-net 是不是支持命名元组?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 不支持记录类型? (即可变的命名元组)

protobuf-net 生成的 .proto 文件中的字段命名约定不正确?

text 元组/命名元组是不可变的,快速创建类的方法

Protobuf-net & IL2CPP - System.Reflection.Emit 不受支持

使用 protobuf-net 进行质量过滤

protobuf-net 嵌套类支持?订单注释?