2011-03-28 47 views
0

我想序列化一個對象到XML但是我的對象是一個通用的列表包含許多記錄,並導致序列化程序消耗大量的內存。所以,我想直接與下面的代碼序列化到一個GZipStream:XmlSerialize直接到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 

不過,我試圖將數據讀入decompressData數組時碰上InvalidDataException The magic number in GZip header is not correct. Make sure you are passing in a GZip stream.

當我序列化到一個單獨的存儲器流,然後再壓縮該流,例如:

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時會失敗?

回答

0

問題的原因是因爲在寫入GZipStream時,GZipStream與MemoryStream的行爲不同(顯然)。它不能很好地處理分頁寫入。