.NET压缩XML以存储在SQL Server数据库中

目前,我们的.NET应用程序在内存中构建XML数据,并将其保存到SQL Server数据库中。 使用ToString()将XElement对象转换为字符串,然后将其存储在DB中的varchar(MAX)列中。 我们不想使用SQL XML数据类型,因为我们不需要任何validation,SQL不需要在任何阶段查询XML。

尽管此实现工作正常,但我们希望通过在存储之前压缩XML并在检索数据库后对其进行解压缩来减小数据库的大小。 有没有人有任何压缩XElement对象的示例代码(解压缩也会很棒)? 此外,我需要对数据库列的数据类型进行哪些更改,以便我们可以充分利用此压缩?

我再次调查了SQL Server 2005提供的XML数据类型,它提供的validation开销太高,我们无法考虑使用它。 此外,虽然它确实压缩了XML,但它没有.NET DeflateStream类那么多的压缩。

我已经通过将我们使用的XML写入磁盘,然后将comrpessed版本保存为新文件来测试DeflateStream类。 结果很棒,一个16kb的文件下降到一个3kb的文件,所以这就是让它在内存中工作并将结果数据保存到数据库的情况。 有没有人有任何示例代码来进行压缩,我应该将varcahr(MAX)colum更改为type to varbinary?

提前致谢

本文可以帮助您开始。

以下代码段可以压缩字符串并返回base-64编码结果:

public static string Compress(string text) { byte[] buffer = Encoding.UTF8.GetBytes(text); MemoryStream ms = new MemoryStream(); using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) { zip.Write(buffer, 0, buffer.Length); } ms.Position = 0; MemoryStream outStream = new MemoryStream(); byte[] compressed = new byte[ms.Length]; ms.Read(compressed, 0, compressed.Length); byte[] gzBuffer = new byte[compressed.Length + 4]; System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length); System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4); return Convert.ToBase64String (gzBuffer); } 

编辑:除此之外,您可能希望使用CLOB格式,即使将XML存储为文本也是如此,因为varchars的长度非常有限 – XML通常很快就会超出。

我认为你还应该重新测试XML列。 它以二进制forms存储,我知道,不是文本。 即使您实际上不需要其他function,它也可能更小,并且可能表现不佳。

除了可能压缩字符串本身(可能使用上面的LBushkin的Base64方法),你可能想要开始确保你杀死所有的空格。 默认的XElement.ToString()方法使用“indenting”保存元素。 如果要确保获得标记和数据,则需要使用ToString(SaveOptions选项)方法(使用SaveOptions.DisableFormatting)。

我知道你标记了SQL 2005的问题,但你应该考虑升级到SQL 2008并使用它附带的精彩的新压缩function 。 是开箱即用的,对您的应用程序透明,并将为您节省大量的实施/测试/支持成本。