Не удается десериализовать MessagePack обратно в JSON

В столбце базы данных хранятся байты из JSON, сериализованного с помощью библиотеки JavaScript ygoe/msgpack.js.

В 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, что означает, что байты в базе данных кажутся действительными.

Есть идеи, что может быть не так?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 936
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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;
}

Другие вопросы по теме