2012-03-24 12 views
1

Ich möchte die Größe der Nachricht beim Senden von serialisierten Integer über das Netzwerk reduzieren. Im folgenden Abschnitt buff.Length ist 256 - zu viel Aufwand, um effizient zu sein! Wie kann es auf das Minimum reduziert werden (4 Bytes + Mindestaufwand)?Wie serialisierte Daten zu minimieren - binäre Serialisierung hat großen Aufwand

  int val = RollDice(6); 
      // Should 'memoryStream' be allocated each time! 
      MemoryStream memoryStream = new MemoryStream(); 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(memoryStream, val); 
      byte[] buff = memoryStream.GetBuffer(); 

Vielen Dank im Voraus, --- KostaZ

+0

formatter.Serialize (memoryStream, val, Nothing)? – alexander

+0

Warum serialisieren Sie im Speicher, wenn das Ziel das Netzwerk ist? Serialize direkt in das Netzwerk, dann liefert das Netzwerk den Speicher statt Ihrer CPU. – EJP

Antwort

1

Werfen Sie einen Blick auf protobuf.net ... es ist eine sehr gute Serialisierung lib ist (man kann es auf NuGet bekommen). Im Idealfall sollten Sie eine "using" -Anweisung um Ihren Speicherstream verwenden.

Um auf den folgenden Kommentar zu antworten, hängt die effizienteste Methode von Ihrem Anwendungsfall ab. Wenn Sie genau wissen, was Sie serialisieren müssen und keinen Allzweck-Serialisierer benötigen, könnten Sie Ihren eigenen Binär-Formatierer schreiben, der vielleicht überhaupt keinen Aufwand hat (hier gibt es einige Details custom formatters).

Diese link hat einen Vergleich der BinaryFormatter und protobuf.net für Ihre Referenz.

+0

Ja, es ist gut. Aber könnten Sie einen Link posten, der besagt, dass primitive Werte in PB einen geringeren Overhead haben würden? Downvoted. –

+0

Messepunkt. Ich weiß nicht, dass es einen niedrigeren Wert hätte, aber ich denke, mein Punkt ist, dass es eine bessere (IMO) Serialisierungsbibliothek ist als der Binärformatierer. Der Overhead wird von der Serialization-Lib abhängen, also könnte er seinen eigenen Serialisierungsformatierer implementieren, der 4 Bytes plus "Minimum" erreicht (was nichts sein könnte, wenn er nur Ganzzahlen serialisiert), dann wäre das die beste Methode, aber für eine allgemeine Antwort auf "minimieren serialisierte Daten" würde ich protobuf.net vorschlagen. –

+0

gibt es auch [dotnet-protobufs] (https://github.com/jskeet/dotnet-protobufs) von Jon Skeet –