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のエクスプローラでそれを開こうとすると: ここで何が間違っていますか?
私は他のStackOverflowエントリを探しましたが、私は問題を解決するものを見つけられませんでした。一時ファイルを使用するのではなく、メモリ内で圧縮したい。
1)あなたは、あなたの 'carStream'に' flight'と呼ばれるものをシリアル化しています。あなたは 'car'をシリアライズしてはいけませんか? 2) 'zipStream.ToArray()'を返す前に 'archive'を破棄してください(つまり、最も内側の' using'の外側にreturn文を移動してください)。 – dbc
ちなみに、なぜ、 'new XmlSerializer(typeof(Car))を使って' zippedFileStream'に直接シリアル化しないのですか?Serialize(zippedFileStream、car); '中間' carStream'を完全に削除しますか? – dbc
あなたはどちらも正しいです。私はToArray()を呼び出す前にZipArchiveオブジェクトを処分し、今は正常に動作します。ご協力ありがとうございました。 – Bedford