如何使用 protobuf 在 C# 中序列化字典?

Posted

技术标签:

【中文标题】如何使用 protobuf 在 C# 中序列化字典?【英文标题】:How to serialize a Dictionary in C# using protobuf? 【发布时间】:2021-06-08 19:43:39 【问题描述】:

是否可以使用 protobuf 序列化字典?

概括地说,我有一个使用 Lua 编写的函数,其中包含一个表:

function DM()
  
    config = 
        stop_sign = 0.60, 
        traffic_signal = 0.80
        
        
    UDC:publishAIMLConfig("config")
    
UDC:aimlEventImageDataReq('aimldatacollection',1,priorityLevel,cameraID,resolution,1,5,5,uplink)
end

在 C# 上,我有一个函数,它从表中接收值并将它们存储到 类型的字典中并打印出来。但我真正想做的是接收这些值,将它们序列化并通过 MQTT 发送到另一个应用程序。

public void publishAIMLConfig(string inputTable)

    LuaTable tb = Form1.state.GetTable(inputTable);

    Dictionary<object, object> dict = Form1.state.GetTableDict(tb);

    foreach (KeyValuePair<object, object> de in dict)
    
        Console.WriteLine("0 1", de.Key.ToString(), de.Value.ToString());
    

问:有没有办法在 C# 字典中序列化对象,如果有,proto 文件会是什么样子?

【问题讨论】:

您是否尝试单独序列化每个键和值?还是序列化每个键/值对? 【参考方案1】:

这里真正的问题不是字典——而是object 的用法。 Protobuf 不包含类型元数据(除非您使用Any),这意味着两端需要事先就发送和接收的内容达成一致。这对于 object/object 地图之类的东西是不可能的。 一些方法可以在 protobuf 中处理一组已知类型 - 主要是通过 oneof - 但这需要您提前确定可能的类型并有效地更改您的结构以便您处理具有 oneof 成员的类型。最后要注意,protobuf 中的map 只为原始和固定(意思是:不是oneof)键类型定义;如果您需要更大的灵活性,您仍然可以执行类似的操作,但您需要编写自己的“键值对”消息类型,其中键和值是 具有 oneof 的类型。

【讨论】:

以上是关于如何使用 protobuf 在 C# 中序列化字典?的主要内容,如果未能解决你的问题,请参考以下文章

C# Protobuf-net:如何从网络流中连续反序列化?

如何使用 Protobuf.net C# 序列化自定义对象基础属性

使用 protobuf-net 反序列化字典

关于在 C# 中使用 Protobuf-Net

我可以使用 protobuf-net 在 Mono 中序列化一个对象(包含成员:​​字典、列表...等)并在 MS.NET 中反序列化它,反之亦然?

从天网序列化 protobuf 和在 C# 中序列化给出不同的字节