2017-01-28 7 views
1

クラスのインスタンスを直列化して(Carと呼ぶ)、xmlに変換し、メモリ内で単一のファイルエントリを持つzipファイルに圧縮しようとしていますその中に。 私はそれを行うにはSystem.IO.Compression.ZipArchiveクラスを使用しています:C言語のSystem.IO.Compressionでメモリ内のオブジェクトを圧縮する

private byte[] CompressCar(Car car) 
{ 
    using (var carStream = new MemoryStream()) 
    using (var zipStream = new MemoryStream()) 
    using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create)) 
    { 
     new XmlSerializer(typeof(Car)).Serialize(carStream, car); 
     ZipArchiveEntry entry = archive.CreateEntry("car.xml", CompressionLevel.Optimal); 
     using (var zippedFileStream = entry.Open()) 
     { 
      carStream.Seek(0, SeekOrigin.Begin); 
      carStream.CopyTo(zippedFileStream); 
     } 
     return zipStream.ToArray(); 
    } 
} 

私は、ファイルに圧縮されたバイトを保存し、後で私はエラーを取得するWindowsのエクスプローラでそれを開こうとすると: enter image description here ここで何が間違っていますか?

私は他のStackOverflowエントリを探しましたが、私は問題を解決するものを見つけられませんでした。一時ファイルを使用するのではなく、メモリ内で圧縮したい。

+1

1)あなたは、あなたの 'carStream'に' flight'と呼ばれるものをシリアル化しています。あなたは 'car'をシリアライズしてはいけませんか? 2) 'zipStream.ToArray()'を返す前に 'archive'を破棄してください(つまり、最も内側の' using'の外側にreturn文を移動してください)。 – dbc

+1

ちなみに、なぜ、 'new XmlSerializer(typeof(Car))を使って' zippedFileStream'に直接シリアル化しないのですか?Serialize(zippedFileStream、car); '中間' carStream'を完全に削除しますか? – dbc

+1

あなたはどちらも正しいです。私はToArray()を呼び出す前にZipArchiveオブジェクトを処分し、今は正常に動作します。ご協力ありがとうございました。 – Bedford

答えて

1

基礎となるzipStream.ToArray()を返す前にZipArchiveを処分する必要があります。

public static class SerializationExtensions 
{ 
    public static byte[] ToCompressedXmlZipArchive<T>(T root, string entryName) 
    { 
     using (var zipStream = new MemoryStream()) 
     { 
      using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create)) 
      { 
       var entry = archive.CreateEntry(entryName, CompressionLevel.Optimal); 
       using (var zippedFileStream = entry.Open()) 
       { 
        new XmlSerializer(typeof(T)).Serialize(zippedFileStream, root); // Possibly use root.GetType() instead of typeof(T) 
       } 
      } 
      return zipStream.ToArray(); 
     } 
    } 
} 

をそしてあなたの方法は次のようになります:例えば、次のヘルパーメソッドを抽出でき

private byte[] CompressCar(Car car) 
    { 
     return SerializationExtensions.ToCompressedXmlZipArchive(car, "car.xml"); 
    } 
関連する問題