2010-06-01 6 views
6

ich BinaryFormatter mich entschieden, um zu sehen, wie es für mich arbeiten und ich habe eine einfache Frage:BinaryFormatter mit Memory Frage

Wenn es mit der Zeichenfolge mit HALLO, und ich wandle die Memorystream in ein Array, es gibt mir 29 Dimensionen, mit fünf von ihnen die eigentlichen Daten gegen Ende der Dimensionen sein:

  BinaryFormatter bf = new BinaryFormatter(); 

      MemoryStream ms = new MemoryStream(); 

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

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

      bytes = ms.ToArray(); 

kehrt

-  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 

gibt es eine Möglichkeit, nur die d zurückkehren ata codiert als Bytes ohne alle überflüssigen Informationen?

Antwort

6

All diese fremden Informationen erzählt die anderen BinaryFormatter (das wird Deserialisieren das Objekt), welche Typ von Objekt deserialisiert wird (in diesem Fall, System.String). Je nach Art, enthält es andere Informationen benötigt, um die Aufgabe zu rekonstruieren (zum Beispiel, wenn es ein StringBuilder wäre, würde die Capacity auch dort verschlüsselt wird.

Wenn alles, was Sie tun wollen Zeug in ein MemoryStream ein String Puffer:

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

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

Hinweis: der 'StreamWriter' Konstruktor erstellt intern eine Instanz von' UTF8Encoding' die eigentliche Umwandlung in Bytes zu tun, wenn alles, was Sie ein Array von Bytes in einen String entsprechenden benötigen, dann 'MemoryStream' und. 'TextWriter' sind nicht wirklich die Lösung - sie stellen nur eine zufällige Möglichkeit dar, implizit die Klasse zu erstellen, die die Lösung bereitstellt.Verwenden Sie einfach' Encoding.UTF8.GetBytes' direkt - oder Verwenden Sie die richtige Codierungsklasse für die von Ihnen benötigte Zeichencodierung (UTF-8 ist eine gute Standardauswahl). –

2

Verwenden Sie für eine einfache Zeichenfolge einen BinaryWriter. Der Overhead wird auf ein Präfix geringer Länge reduziert.

BinaryFormatter ist für das Serialisieren von (komplexen) Objektclustern vorgesehen und benötigt dazu einige zusätzliche Datenstrukturen.

2

Es hängt davon ab, was Sie eigentlich wollen. Sie können ein UTF8-Byte-Array aus einer Zeichenfolge mit Encoding.UTF8.GetBytes abrufen.

2

Sie sollten nicht alle diese "irrelevanten" Informationen entfernen. Der Deserializer benötigt ihn am anderen Ende, wenn Sie das Objekt aus den serialisierten Daten wiederherstellen möchten.

2

Versuchen Sie nur, die Zeichenfolge in ein Byte-Array zu konvertieren? Wenn das Ihr Ziel ist es, können Sie etwas tun, eher wie:

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