2016-12-15 119 views
2

TCP経由でオブジェクトを別のマシンに文字列として転送しようとしています。私は、BinaryFormatterとGZipStreamの組み合わせを使用することに決めました。そして、それをBase64でエンコードしてから送信します。反対側では、私は逆を行う - 文字列をデコード、GZipStreamは、それを解凍し、最後にそれを逆シリアル化します。このように実装すると、それだけが動作しません。ブロック長がその補数と一致しません。を取得しています。 未処理の例外中の例外GZipStream - ブロックの長さがその補数と一致しません

 string s = new String('@', 10000); 
     string s2 = ""; 

     string data; 

     using (var ms = new MemoryStream()) 
     { 
      using (var gzip = new GZipStream(ms, CompressionMode.Compress)) 
      { 
       var bf = new BinaryFormatter(); 
       bf.Serialize(gzip, s); 

       gzip.Flush(); 
       ms.Flush(); 

       data = Convert.ToBase64String(ms.GetBuffer()); 
      } 
     } 

     using (var ms = new MemoryStream(Convert.FromBase64String(data))) 
     { 
      using (var gzip = new GZipStream(ms, CompressionMode.Decompress, true)) 
      { 
       var binaryFormatter = new BinaryFormatter(); 
       s2 = binaryFormatter.Deserialize(gzip) as string; 
      } 
     } 

     if (s != s2) 
     { 
      Console.WriteLine("Doesnt match"); 
     } 

結果:System.IO.InvalidDataException:ブロック長がその補数と一致していません。

私が最も混乱しているのは、ローカルでBase64エンコーディングを取り除くと正常に動作するということです。

答えて

1

可変データに割り当てる前にGZipStreamを閉じる必要があります。

... 
bf.Serialize(gzip, s); 

gzip.Close(); 

data = Convert.ToBase64String(ms.GetBuffer()); 
関連する問題