2011-08-08 9 views
2

C#でobject [] []を圧縮する必要があります。私はGzipコンプレックスを使うことができます - バイト[]を解凍しますが、そのような場合にはどうすればいいですか?変換C#でObject [] []を圧縮するには

+2

配列にはどのような種類のオブジェクトがありますか?シリアライズできる場合は、シリアライズして、GZipで圧縮します。それらを直列化できない場合、圧縮を実行するための汎用的または標準的な方法はありません。 – driis

+0

詳細を提供する必要があります。そのような方法の出力は何ですか?その配列にはどんな種類のオブジェクトがありますか?それらは値型か参照型、あるいはその両方ですか? – Joe

答えて

3

バイナリシリアル化を使用して、バイト配列に変換してからzipします。配列内のすべてのオブジェクトがシリアライズ可能な場合は、次の操作を実行できます。

object[][] objects = new[] {new[] {"a"}}; 
BinaryFormatter formatter = new BinaryFormatter(); 
using (MemoryStream memoryStream = new MemoryStream()) 
using (GZipStream gZipStream = new GZipStream(File.OpenWrite("C:\\zipped.zip"), 
    CompressionMode.Compress)) 
{ 
    formatter.Serialize(gZipStream, objects); 
} 

//unzipping 
using (GZipStream gZipStream = new GZipStream(File.OpenRead("C:\\zipped.zip"), 
    CompressionMode.Decompress)) 
{ 
    objects = (object[][])formatter.Deserialize(gZipStream); 
    Console.WriteLine(objects[0][0]); //a 
} 
+0

+1デシリアライズするプロセス[/ code]は? (完全のために) –

+0

@pst done、私は制限が嫌いです –

+0

ありがとうございます。まさに私が探していたもの。 – Cannon

2
  1. あなたbyte[]
  2. 圧縮にobject[][]byte[]

ステップ1が難しい部分である、と彼らはbyte[]秒に変換することができるように、すべてのオブジェクトは、直列化可能であることを必要とします。これはトリッキーです

理由はobject[]の内容が実際にメモリ内の様々なobject sのちょうどメモリ参照であり、それらのobject sが同様に他のobject Sへの参照を持つことができるということです。一部のユーザーは、割り当てられているI/Oポートなどの特定のシステムリソースを参照することもできます。このコンピュータはオブジェクトに同じリソースを与えていないので、このようなオブジェクトを別のコンピュータに送信するのは意味がありません。したがって、クラスがシリアル化され、バイトストリームに逆シリアル化されることが特に示されていない限り、それらを使って何もできません。

関連する問題