Учитывая этот простой класс:
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 не должен быть логически эквивалентным оригинальному? Почему «raw» JsonTextReader
имеет возможность обрабатывать строку как массив из 64 байтов, а версия JTokenReader
- нет?