试图让 msgpack-cli 给我与 JavaScript 中相同的打包字节数组

Trying to get msgpack-cli to give me the same packed byte array as it does in JavaScript

在JavaScript中,我可以使用msgpack来打包一个对象如下:

msgpack.pack(payload);

其中 payload 是以下对象:

var payload = { event: "phx_join", payload: {}, ref: "1", topic: "players:1" };

当我对该对象调用 msgpack.pack(payload); 时,我得到以下字节(作为 Uint8Array):

[132, 165, 116, 111, 112, 105, 99, 169, 112, 108, 97, 121, 101, 114, 115, 58, 49, 165, 101, 118, 101, 110, 116, 168, 112, 104, 120, 95, 106, 111, 105, 110, 167, 112, 97, 121, 108, 111, 97, 100, 128, 163, 114, 101, 102, 161, 49]

如何在 C# 中使用 msgpack-cli 将对象从 C# 转换为与上述相同的字节序列?我在 C# 中使用的对象格式并不那么重要,重要的是字节序列相同。这是我尝试过的:

public class Payload
{
    public string @event;
    public MessagePackObject payload;
    public string @ref;
    public string topic;
}

var payload = new Payload
{
    @event = "phx_join",
    payload = new MessagePackObject(),
    @ref = "1",
    topic = "players:1"
};
var packedBytes = SerializationContext.Default.GetSerializer<Payload>().PackSingleObject(payload);

不幸的是,在这种情况下我得到的打包字节如下:

[148, 168, 112, 104, 120, 95, 106, 111, 105, 110, 192, 161, 49, 169, 112, 108, 97, 121, 101, 114, 115, 58, 49]

它和我从JavaScript得到的打包数据不一样。我认为消息包应该是跨平台友好的。这里发生了什么,我如何创建一个 C# 等效对象以使反序列化器将其打包到与 JavaScript?

中相同的字节数组中

我明白了。诀窍是检查 JavaScript 中编码的第一个字节,您会看到 132 对应于 HEX 0x84。 HEX 0x84根据message pack specification是一个fixmap0x800x8f)。使用此提示,我们可以尝试猜测 fixmap 必须对应于 C# 中的字典数据类型(因为映射或多或少类似于键值对的字典)。

我们只需要使用一个负载对象,它实际上是 stringobject 对的字典,msgpack-cli 将成功地将它打包到 C# 中的相同字节序列:

var payload = new Dictionary<string, object>() {
    { "event", "phx_join" },
    { "payload", new Dictionary<string, object>() },
    { "ref", "1" },
    { "topic", "players:1" }
};
var packedBytes = SerializationContext.Default.GetSerializer<Dictionary<string, object>>().PackSingleObject(payload);