亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法將 MessagePack 反序列化回 JSON

無法將 MessagePack 反序列化回 JSON

C#
白衣染霜花 2022-11-13 14:55:49
在數據庫列中,存儲了使用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 databasevar 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: 56var test2 = MessagePackSerializer.Deserialize<RootObject>(bytes);  //=> System.InvalidOperationException: 'code is invalid. code:56 format:positive fixint'var test3 = MessagePackSerializer.ToJson(bytes);    //=> Value:      "56"//Manuallyvar 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: 10893var test5 = MessagePackSerializer.Deserialize<dynamic>(test4);  //OKvar test6 = MessagePackSerializer.Deserialize<RootObject>(test4);  //System.InvalidOperationException: 'code is invalid. code:218 format:str 16'var test7 = MessagePackSerializer.FromJson(json);   //Size: 5928var test8 = MessagePackSerializer.ToJson(test7);    //OK正如你在上面看到的,我嘗試了幾種反序列化的方法,但都沒有奏效。我經常在輸出中得到 56 或 218,但我的 JSON 不包含此值。我嘗試了所有解析器,但都沒有用。但是,當在這個網站上復制/粘貼十六進制時,我能夠獲得 JSON,這意味著數據庫中的字節似乎是有效的。知道什么可能是錯的嗎?
查看完整描述

1 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

解決方案是轉換為 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;

}


查看完整回答
反對 回復 2022-11-13
  • 1 回答
  • 0 關注
  • 113 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號