微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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通常很快就会超出.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。