2010-06-01 8 views
6

estoy probando BinaryFormatter para ver cómo se va a trabajar para mí y tengo una pregunta simple:BinaryFormatter con MemoryStream Pregunta

Al utilizarlo con la cadena HOLA, y convertir el MemoryStream a una matriz, que me da 29 dimensiones, con cinco de ellos que son los datos reales hacia el final de las dimensiones:

  BinaryFormatter bf = new BinaryFormatter(); 

      MemoryStream ms = new MemoryStream(); 

      byte[] bytes; 
      string originalData = "HELLO"; 

      bf.Serialize(ms, originalData); 
      ms.Seek(0, 0); 

      bytes = ms.ToArray(); 

vuelve

-  bytes {Dimensions:[29]} byte[] 
     [0] 0 byte 
     [1] 1 byte 
     [2] 0 byte 
     [3] 0 byte 
     [4] 0 byte 
     [5] 255 byte 
     [6] 255 byte 
     [7] 255 byte 
     [8] 255 byte 
     [9] 1 byte 
     [10] 0 byte 
     [11] 0 byte 
     [12] 0 byte 
     [13] 0 byte 
     [14] 0 byte 
     [15] 0 byte 
     [16] 0 byte 
     [17] 6 byte 
     [18] 1 byte 
     [19] 0 byte 
     [20] 0 byte 
     [21] 0 byte 
     [22] 5 byte 
     [23] 72 byte 
     [24] 69 byte 
     [25] 76 byte 
     [26] 76 byte 
     [27] 79 byte 
     [28] 11 byte 

¿hay una manera única para devolver el d ata codificado como bytes sin toda la información extraña?

Respuesta

6

Toda esa información superflua dice al otro BinaryFormatter (que deserializar el objeto) lo tipo está siendo deserializado del objeto (en este caso, System.String). Dependiendo del tipo, que incluye otra información necesaria para reconstruir el objeto (por ejemplo, si se tratara de un StringBuilder, el Capacity también sería codificado en ese país.

Si todo lo que quiere hacer es cosas de una cadena en un MemoryStream búfer:

 using (MemoryStream ms = new MemoryStream()) 
     using (TextWriter writer = new StreamWriter(ms)) 
     { 
      writer.Write("HELLO"); 
      writer.Flush(); 

      byte[] bytes = ms.ToArray(); 
     } 
+2

Nota: el constructor de 'StreamWriter' crea internamente una instancia de' UTF8Encoding' hacer la conversión real de bytes Si todo lo que necesita es una matriz de bytes que corresponden a una cadena, entonces 'MemoryStream' y. 'TextWriter' no es en realidad la solución, son solo una forma fortuita de crear implícitamente la clase que proporciona la solución. Simplemente use' Encoding.UTF8.GetBytes' directamente - o utilice la clase de codificación correcta para la codificación de caracteres que necesite (UTF-8 es una buena opción predeterminada). –

2

Para una cadena simple, use un BinaryWriter. La sobrecarga se reducirá a un pequeño prefijo de longitud.

BinaryFormatter está destinado a la serialización de agrupamientos de objetos (complejos) y necesita algunas estructuras de datos auxiliares para hacer eso.

2

Depende de lo que realmente desea. Puede obtener una matriz de bytes UTF8 de una cadena con Encoding.UTF8.GetBytes.

2

No debe quitar toda esa información "extraña". El deserializador lo necesita en el otro extremo cuando desea reconstituir el objeto a partir de los datos serializados.

2

¿Está tratando de convertir la cadena a una matriz de bytes? Si ese es su objetivo, se puede hacer algo más como:

byte[] bits = System.Text.Encoding.UTF8.GetBytes("HELLO"); 
Cuestiones relacionadas