XmlSerialize напрямую в GZipStream вызывает исключение магического числа при декомпрессии - PullRequest
0 голосов
/ 28 марта 2011

Я пытаюсь сериализовать объект в 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 The magic number in GZip header is not correct. Make sure you are passing in a GZip stream. при попытке чтения данных в массив deppressData.

КогдаСначала я сериализую в отдельный поток памяти, а затем сжимаю этот поток, например:

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?

1 Ответ

0 голосов
/ 12 сентября 2011

Причиной проблемы является то, что GZipStream ведет себя по-разному (очевидно) по отношению к MemoryStream при записи в него.Он не очень хорошо справляется с постраничными записями.

...