Почему Newtonsoft.Json сериализует byte[] как base64, но sbyte[] нет?

#c# #serialization #json.net #base64

#c# #сериализация #json.net #base64

Вопрос:

кодировка byte[] в base64,sbyte[] — нет.

 byte[] bs = {100,101};
Newtonsoft.Json.JsonConvert.SerializeObject(bs);//"ZGU="

sbyte[] sbs = {100,101};
Newtonsoft.Json.JsonConvert.SerializeObject(sbs);//"[100,101]"
  

Комментарии:

1. для меня это действительно странно, я воспроизвел локально. поискал в документах, но не нашел быстрого ответа.

2. byte[] это стандартный способ представления двоичных данных в объектах — некоторые из них могут быть непечатаемыми символами ASCII. Таким образом, использование символа ascii не является вариантом. Строка кодирования Base64 короче, чем список чисел, разделенных запятой; отсюда и соглашение об использовании Base64. Если вы действительно хотите использовать byte целочисленные значения as tyni, попробуйте объявить их как Collection<byte> или List<byte> .

3. Я просто хочу знать, почему sbyte[] не сериализуется как Base64

Ответ №1:

Это просто способ JSON.Сеть работает, и я подозреваю, что большинство сериализаторов делают то же самое. Проверьте документацию, в которой явно сказано, что byte[] это сериализуется как строка в кодировке base64.

Все остальные массивы обрабатываются так, как и следовало ожидать, как простые типы массивов JSON, где элементы сериализуются в соответствии с правилами для типа массива. Это означает, что sbyte[] это будет сериализовано как массив целых чисел.

Комментарии:

1. Как Google-gson десериализует строку json, закодированную в base64?

Ответ №2:

Руководство по сериализации в документации для JSON.Сеть показывает, что для sbyte[] массива не существует правила сериализации. Однако существует запись для sbyte . sbyte будет сериализован как int .

byte[] массивы будут сериализованы в base64 строку, поскольку это явно определено в руководстве, и для удобства.

Поскольку в руководстве по сериализации нет правила для sbyte[] , массив будет обрабатываться как любой другой массив, и его элементы будут сериализованы в соответствии с руководством. Следовательно, sbyte[] сериализуется в int[] , поскольку sbyte сериализуется в int .

Пожалуйста, смотрите изображение ниже:

введите описание изображения здесь