C# 在C中使用System.IO.Compression压缩内存中的对象#

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

我试图将一个类的实例(我们称之为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();
        }
    }
}

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");
    }