Учитывая этот простой класс:
class HasBytes
{
public byte[] Bytes { get; set; }
}
Я могу поместить его через JSON.NET, чтобы массив байтов был закодирован в base-64:
var bytes = new HasBytes { Bytes = new byte[] { 1, 2, 3, 4 } };
var json = JsonConvert.SerializeObject(bytes);
Затем я могу перечитать его еще раз таким немного усложненным способом:
TextReader textReader = new StringReader(json);
JsonReader jsonReader = new JsonTextReader(textReader);
var result = (HasBytes)JsonSerializer.Create(null)
.Deserialize(jsonReader, typeof(HasBytes));
Все хорошо. Но если я сначала превращу содержимое jsonReader
в JToken
:
var jToken = JToken.ReadFrom(jsonReader);
А затем снова превратите его в JsonReader
, заключив в JTokenReader
:
jsonReader = new JTokenReader(jToken);
Затем десериализация выдает исключение: «Ожидаемые байты, но полученная строка».
Разве новый JsonReader не должен быть логически эквивалентен исходному? Почему «сырая» версия JsonTextReader
имеет возможность обрабатывать строку как массив байтов с основанием 64, а версия JTokenReader
— нет?