目前,我们的.NET应用程序在内存中构建XML数据,并将其保存到sql Server数据库中.使用ToString()将XElement对象转换为字符串,然后将其存储在DB中的varchar(MAX)列中.我们不想使用sql XML数据类型,因为我们不需要任何验证,sql不需要在任何阶段查询XML.
尽管此实现工作正常,但我们希望通过在存储之前压缩XML并在检索之后对其进行解压缩来减小数据库的大小.有没有人有任何压缩XElement对象的示例代码(解压缩也会很棒)?此外,我需要对数据库列的数据类型进行哪些更改,以便我们可以充分利用此压缩?
我再次调查了sql Server 2005提供的XML数据类型,它提供的验证开销太高,我们无法考虑使用它.此外,虽然它确实压缩了XML,但它没有.NET DeflateStream类那么多的压缩.
我已经通过将我们使用的XML写入磁盘来测试DeflateStream类,然后将comrpessed版本保存为新文件.结果很棒,一个16kb的文件下降到一个3kb的文件,所以这就是让它在内存中工作并将结果数据保存到数据库的情况.有没有人有任何示例代码来进行压缩,我应该将varcahr(MAX)colum更改为type to varbinary?
提前致谢
解决方法:
This article可以帮助您开始.
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);
}
编辑:另外,即使将XML作为文本存储,您也可能希望使用CLOB格式,因为varchars的长度非常有限 – XML通常很快就会超出.