无法将 MessagePack 反序列化回 JSON

在数据库列中,存储了使用ygoe/msgpack.js JavaScript 库序列化的 JSON 中的字节。


在 C# 中,我使用neuecc/MessagePack-CSharp库将此值反序列化为 JSON:


//From database (bytes generated from JavaScript ygoe/msgpack.js)

var bytes = connection.Query<byte[]>(sql).FirstOrDefault(); //Size: 11160 - Get bytes from database

var hexa = System.Text.Encoding.UTF8.GetString(bytes);  //=> Value: 8ca76...

var hexaString = FromHexString(hexa);   //=> Value: ��meeting��id�\0\r�ۭmeetingNumber�2018194530...

var test1 = MessagePackSerializer.Deserialize<dynamic>(bytes);  //=> Value: 56

var test2 = MessagePackSerializer.Deserialize<RootObject>(bytes);  //=> System.InvalidOperationException: 'code is invalid. code:56 format:positive fixint'

var test3 = MessagePackSerializer.ToJson(bytes);    //=> Value:      "56"


//Manually

var jsonTest = "...JSON data..."; //Paste hexa on an online tool and use associated JSON (https://toolslick.com/conversion/data/messagepack-to-json#)

var test4 = MessagePackSerializer.Serialize(json);  //Size: 10893

var test5 = MessagePackSerializer.Deserialize<dynamic>(test4);  //OK

var test6 = MessagePackSerializer.Deserialize<RootObject>(test4);  //System.InvalidOperationException: 'code is invalid. code:218 format:str 16'


var test7 = MessagePackSerializer.FromJson(json);   //Size: 5928

var test8 = MessagePackSerializer.ToJson(test7);    //OK

正如你在上面看到的,我尝试了几种反序列化的方法,但都没有奏效。我经常在输出中得到 56 或 218,但我的 JSON 不包含此值。我尝试了所有解析器,但都没有用。


但是,当在这个网站上复制/粘贴十六进制时,我能够获得 JSON,这意味着数据库中的字节似乎是有效的。


知道什么可能是错的吗?


白衣染霜花
浏览 70回答 1
1回答

函数式编程

解决方案是转换为 HEX UTF8,然后再转换回byte[].代码 :public RootObject Deserialize(byte[] bytes){&nbsp; &nbsp; var hexUtf8 = Encoding.UTF8.GetString(bytes);&nbsp; &nbsp; var bytesUtf8 = HexStringToByteArray(hexUtf8);&nbsp; &nbsp; var serializer = MessagePackSerializer.Get<RootObject>();&nbsp; &nbsp; var stream = new MemoryStream(bytesUtf8);&nbsp; &nbsp; return serializer.Unpack(stream);}public static byte[] HexStringToByteArray(this string hex){&nbsp; &nbsp; var result = new byte[hex.Length / 2];&nbsp; &nbsp; for (var i = 0; i < result.Length; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; result[i] = System.Convert.ToByte(hex.Substring(i * 2, 2), 16);&nbsp; &nbsp; }&nbsp; &nbsp; return result;}
打开App,查看更多内容
随时随地看视频慕课网APP