2010-04-15 5 views
7

Учитывая этот простой класс:Байт сериализация массива в Json.NET

class HasBytes 
{ 
    public byte[] Bytes { get; set; } 
} 

я могу положить его через Json.NET таким образом, что массив является базой 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 имеет возможность обрабатывать строку в виде байтового массива base-64, тогда как версия JTokenReader нет?

ответ

6

Это, кажется, ошибка в JTokenReader, насколько я могу видеть, поэтому у меня есть reported it here.

Обновление: фиксируется в Json.NET 3.5 выпуска 7.