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

目前,我们的.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可以帮助您开始.

以下代码段可以压缩字符串并返回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);
}

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

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念