文本VS二进制写入XML,文件大小竟相差这么多!你还在用默认方式吗?

XML 文件体积过大,不但会占用存储空间,而且会显著影响网络传输效率,对此掌握正确的压缩技术,能够让系统性能获得质的提升。

文本格式的局限性

采用明码存储每个字符的那种普通XML文本格式,其元素标签跟属性名称是需要重复性记录的。一旦文档涵盖大量重复性标签,如此这般的冗余便会使文件体积急剧地膨胀起来。就好比存储100条订单记录之际,“订单编号”“客户名称”等这类标签就得重复出现100回,进而导致存储空间惨遭浪费 。

凭借实际测试得以发现,有一个XML文档,其中含有50个节点,其文本格式所需的存储空间为2KB 。当节点数量增长至500个的时候,该文件的体积会扩充到18KB 。这样的非线性增长在处理大数据量之际格外显著,不但会增添存储成本,而且还会致使数据传输速度降低 。

二进制格式的优势

以二进制格式,借助字典映射机制,把那些重复出现的字符串,转变为紧凑数字索引。比如说,将“CustomerName”,映射成为数字5 ,在后续再次出现该字符串的时候,仅仅需要存储一个字节的索引值。这样的一种方法,能够有效地消除文本冗余,大幅度地降低文件体积。

实验得出的数据表明,把1MB的XML文档转变成二进制格式之后,其体积缩减至原本的40%上下。尤其在处置含有诸多相似结构的文档之时,压缩成效更为明显,有时甚至能够达成70%的压缩比率。

    public enum WriteFormat
    {
        Text,
        Binary
    }

MTOM适用场景

MTOM编码对处理涵盖二进制数据的SOAP消息尤为合适,在XML要嵌入图片、PDF附件或者音频文件之际,MTOM能够巧妙地把二进制部分分离出来进行传输,以此维持文本部分的可阅读性,这般混合方式兼顾了效率以及兼容性。

        public void SaveXmlToFile(string filepath,  WriteFormat fmt)
        {
 using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write))
 {
 // 创建Writer
 XmlDictionaryWriter writer = null;
 if (fmt == WriteFormat.Text)
 writer = XmlDictionaryWriter.CreateTextWriter(fs);
 else
 writer = XmlDictionaryWriter.CreateBinaryWriter(fs);
 // 写入文档声明
 writer.WriteStartDocument;
 // 写入根节点
 writer.WriteStartElement("宠物");
 // 写入宠物子节点
 writer.WriteStartElement("名字"); // 
 writer.WriteString("荷兰兔");
 writer.WriteEndElement; // 
 writer.WriteStartElement("年龄"); // 
 writer.WriteString("2");
 writer.WriteEndElement; // 
 // 直接Flush
 writer.Flush;
 writer.Dispose;
 }
        }

在Web服务进行传输期间,MTOM能够切实有效地降低内存被占用的情况。经过测试可以表明,当传输10MB带有附件的SOAP消息之际,运用MTOM相较于普通文本格式而言,能够节省大约35%的带宽,并且与此同时还维持了XML结构的完整性。

创建写入器实例

借助XmlDictionaryWriter类的静态类方法能够迅速创建不同格式的写入器,CreateTextWriter方法去生成文本格式,CreateBinaryWriter生成二进制格式,开发者只要依据需求挑选合适的方法。

构建写入器之际,得去明确输出流以及编码格式哟。提议采用UTF – 8编码,以此确保对于国际字符能够进行正确的处理呢。等构建完毕了以后呀,便能够调用WriteStartDocument之类的方法,依照顺序去写入XML内容啦,其操作方式跟普通的XmlWriter完全是一样的哟。

字典优化机制

XmlDictionary当作字符串池,能够把重复运用的字符串实例整合管理,开发者能够去预定义常用词汇,像命名空间URI、元素名称等,如此在写入时直接借助字典索引就行 。

系统同样支持自动进行字典管理,当并未显式给出字典之际,写入器会自动去收集文档里的全部字符串并且建立映射,这种机制对于处理借着动态生成的 XML 内容而言格外有用,既维持了灵活性,又获取了压缩效益。

实际效果对比

在具体实验当中,能够直观地看到不同格式之间存在着差异,把一个含有20个数据节点的XML,分别保存成文本格式以及二进制格式,其中文本文件占据空间为99字节,然而二进制文件仅仅需要36字节,其体积减少幅度超过了60% 。

拿着文本编辑器去把二进制格式的文件打开,能够瞧见部分可读的标签名和大量的乱码 。之所以会这样 ,是由于字典映射机制把字符串转变为数字索引 ,虽说牺牲了可读性 ,不过换来了存储效率大幅的提升 。

在您所参与的项目里头,有没有碰到过因为 XML 文件体积过大从而致使性能方面出现问题的情况呢?敬请乐意分享您所拥有的解决方案,假定感觉这篇文章具备实用价值,那就请进行点赞给予支持并且分享给更多的开发者吧!

发表评论