Serialization XmlSerialize直接到GZipStream在解压缩时引发幻数异常

Serialization XmlSerialize直接到GZipStream在解压缩时引发幻数异常,serialization,xml-serialization,compression,gzipstream,Serialization,Xml Serialization,Compression,Gzipstream,我试图将一个对象序列化为XML,但是我的对象是一个包含许多记录的通用列表,这会导致序列化程序消耗大量内存。因此,我尝试使用以下代码直接序列化到GZipStream: Dim formatter As XmlSerializer = XmlSerializerFactory.GetSerializerForType(_type) Using _ms As New MemoryStream() Using gzStream As New GZipStream(_ms, Compression

我试图将一个对象序列化为XML,但是我的对象是一个包含许多记录的通用列表,这会导致序列化程序消耗大量内存。因此,我尝试使用以下代码直接序列化到GZipStream:

Dim formatter As XmlSerializer = XmlSerializerFactory.GetSerializerForType(_type)
Using _ms As New MemoryStream()
    Using gzStream As New GZipStream(_ms, CompressionMode.Compress, True)

        _ms.Position = 0
        formatter.Serialize(gzStream, obj)
        _ms.Position = 0
        gzStream.Flush()
        gzStream.Close()
    End Using

    _ms.Position = 0
    Dim decompressData() As Byte
    Using gzStream As New GZipStream(_ms, CompressionMode.Decompress)
        ReDim decompressData(9000 - 1) 'this number doesn't matter, the data in my test sample is small
        Dim Len As Integer = gzStream.Read(decompressData, 0, decompressData.Length)
    End Using
End Using
然而,我遇到了一个InvalidDataException
,GZip头中的幻数不正确。尝试将数据读入解压缩数据数组时,请确保正在传入GZip流。

当我首先序列化到单独的内存流,然后压缩该流时,例如:

Dim formatter As XmlSerializer = XmlSerializerFactory.GetSerializerForType(_type)
Using _ms As New MemoryStream()
    Dim uc_fileBytes() As Byte
    Dim uc_len As Integer
    Using _ms101 As New MemoryStream()
        formatter.Serialize(_ms101, obj)
        uc_fileBytes = _ms101.GetBuffer()
        uc_len = _ms101.Length
    End Using
    Using gzStream As New GZipStream(_ms, CompressionMode.Compress, True)
        _ms.Position = 0
        gzStream.Write(uc_fileBytes, 0, uc_len)
        gzStream.Flush()
        gzStream.Close()
    End Using

    Dim decompressData() As Byte
    Using gzStream As New GZipStream(_ms, CompressionMode.Decompress)
        ReDim decompressData(9000 - 1)
        Dim Len As Integer = gzStream.Read(decompressData, 0, decompressData.Length)
    End Using
End Using

它工作正常,没有错误。但是,当我直接序列化到GZipStream时,为什么它会失败呢?

问题的原因是,在写入GZipStream时,GZipStream的行为(显然)与MemoryStream不同。它不能很好地处理分页书写