2010-04-15 16 views
7

Dado esta clase simple:Byte array serialización en JSON.NET

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

I puede poner a través JSON.NET tal que la matriz de bytes es base-64 codificada:

var bytes = new HasBytes { Bytes = new byte[] { 1, 2, 3, 4 } }; 
var json = JsonConvert.SerializeObject(bytes); 

Entonces puede leerlo de nuevo de esta manera un poco demasiado complicada:

TextReader textReader = new StringReader(json); 
JsonReader jsonReader = new JsonTextReader(textReader); 
var result = (HasBytes)JsonSerializer.Create(null) 
       .Deserialize(jsonReader, typeof(HasBytes)); 

Todo bien. Pero si lo encienda por primera vez el contenido de jsonReader en un JToken:

var jToken = JToken.ReadFrom(jsonReader); 

y después a la que de nuevo en un JsonReader envolviéndolo en un JTokenReader:

jsonReader = new JTokenReader(jToken); 

A continuación, la deserialización se emite una excepción: " Se esperaban bytes pero obtuve la cadena ".

¿No debería el nuevo JsonReader ser lógicamente equivalente al original? ¿Por qué el JsonTextReader "en bruto" tiene la capacidad de tratar una cadena como una matriz de bytes de base 64 mientras que la versión JTokenReader no lo hace?

Respuesta

6

Esto parece ser un error en JTokenReader por lo que puedo ver, así que tengo reported it here.

Actualización: fija en JSON.NET versión 3.5 7.

Cuestiones relacionadas