【问题标题】:Deserialize MessagePack data in Python generated in .NET with struct使用 struct 反序列化在 .NET 中生成的 Python 中的 MessagePack 数据
【发布时间】:2022-11-11 06:46:10
【问题描述】:

我有一个程序,它使用带有结构的 MessagePack 在 .NET 中序列化大量数据(450 个数据点)。我可以反序列化 Python 中的数据,但无法获得 Python 中的密钥结构。

。网

byte[] statusBytes = Decompress(compressedData);

StatusT statusObject = new StatusT();

using (var ms = new MemoryStream(statusBytes))
{
    MessagePackSerializer<StatusT> serializer = MessagePackSerializer.Get<StatusT>();
    statusObject = serializer.Unpack(ms);
}

Python

bStripped = compressedData[4:]

statusBytes= gzip.decompress(bStripped)

return msgpack.unpackb(statusBytes)

这给了我一个最终有约 450 个元素(一旦展平)的列表,我无法从中获得关键结构。例如:

Python 输出

>> [[0, 0, 0], [0, 'BubbleDisable', ['connected', 0], 0, 7, 0, 59, 11, [0], 0, 0, 937], ... [224,['connected', 0], 6, 224]]

我不知道如何使用 C# 中给出的 struct StatusT 定义在 Python 中获取反序列化数据的标头(/键)。

【问题讨论】:

    标签: python c# serialization msgpack


    【解决方案1】:

    解决方案

    使用 CLI pythonnet 库:

    from pythonnet import load
    load('netfx')
    import clr
    clr.AddReference(<path_to_dll>) # for both MsgPack and <my_dotNET_library>
    
    from MsgPack.Serialization import MessagePackSerializer
    from System.IO import MemoryStream
    from <my_dotNET_library> import StatusT
    
    serializer = MessagePackSerializer.Get[StatusT]()
    stream = MemoryStream(bData)
    statusObject = self.serializer.Unpack(stream)
    

    【讨论】:

      最近更新 更多