C# 在C中使用System.IO.Compression压缩内存中的对象#
我试图将一个类的实例(我们称之为Car)序列化为一个xml,并在内存中将其压缩为一个包含单个文件条目的zip文件。 我正在使用System.IO.Compression.ZipArchive类执行此操作:C# 在C中使用System.IO.Compression压缩内存中的对象#,c#,serialization,stream,zip,compression,C#,Serialization,Stream,Zip,Compression,我试图将一个类的实例(我们称之为Car)序列化为一个xml,并在内存中将其压缩为一个包含单个文件条目的zip文件。 我正在使用System.IO.Compression.ZipArchive类执行此操作: private byte[] CompressCar(Car car) { using (var carStream = new MemoryStream()) using (var zipStream = new MemoryStream()) using (var
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();
}
}
}
1) 您正在将名为
flight
的内容序列化到您的carStream
。难道你不应该序列化汽车吗?2) 在返回zipStream.ToArray()
(即使用将return语句移到最里面的之外)之前,尝试处理archive
。顺便提一下,为什么不使用新的XmlSerializer(typeof(Car)),直接序列化到zippedFileStream
。序列化(zippedFileStream,Car)代码>完全消除中间车流
吗?你们都是对的。在调用ToArray()之前,我处理了ZipArchive对象,现在它可以正常工作了。谢谢你的帮助。好的,我会补充一个快速的答案。
private byte[] CompressCar(Car car)
{
return SerializationExtensions.ToCompressedXmlZipArchive(car, "car.xml");
}