【问题标题】:Cannot deserialize MessagePack back to JSON无法将 MessagePack 反序列化回 JSON
【发布时间】:2019-03-26 10:10:32
【问题描述】:

在数据库列中存储了来自使用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 不包含这个值。我尝试了所有解析器,但没有一个起作用。

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

知道可能出了什么问题吗?

【问题讨论】:

    标签: javascript c# msgpack


    【解决方案1】:

    解决方案是先转换为 HEX UTF8,然后再转换回byte[]

    代码:

    public RootObject Deserialize(byte[] bytes)
    {
        var hexUtf8 = Encoding.UTF8.GetString(bytes);
        var bytesUtf8 = HexStringToByteArray(hexUtf8);
    
        var serializer = MessagePackSerializer.Get<RootObject>();
        var stream = new MemoryStream(bytesUtf8);
        return serializer.Unpack(stream);
    }
    
    public static byte[] HexStringToByteArray(this string hex)
    {
        var result = new byte[hex.Length / 2];
        for (var i = 0; i < result.Length; i++)
        {
            result[i] = System.Convert.ToByte(hex.Substring(i * 2, 2), 16);
        }
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 2016-10-08
      • 1970-01-01
      • 2019-02-08
      相关资源
      最近更新 更多