![](/img/trans.png)
[英]Zipping specific files and folders with C# (System.IO.Compression)
[英]Compressing an object in memory with System.IO.Compression in C#
我正在嘗試將一個類的實例(我們稱之為 Car)序列化為一個 xml,並將其在內存中壓縮為一個包含單個文件條目的 zip 文件。 我正在使用 System.IO.Compression.ZipArchive 類來做到這一點:
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 條目,但找不到可以解決我的問題的任何內容。 我想在內存中壓縮它而不是使用臨時文件。
您需要在返回底層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");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.