#javascript #c# #msgpack
#javascript #c# #msgpack
Вопрос:
В столбце базы данных байты из JSON сериализованы с помощью ygoe/msgpack.js Библиотека JavaScript сохранена.
В 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�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, что означает, что байты в базе данных кажутся действительными.
Есть идеи, что может быть не так?
Ответ №1:
Решением было преобразовать в шестнадцатеричный 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 resu<
}