zoukankan      html  css  js  c++  java
  • 【.net 深呼吸】使用二进制格式来压缩XML文档

    在相当多的情况下,咱们写入XML文件默认是使用文本格式来写入的,如果XML内容是通过网络传输,或者希望节省空间,特别是对于XML文档较大的情况,是得考虑尽可能地压缩XML文件的大小。

    XmlDictionaryWriter类从XmlWriter类派生,它公开了一些静方法,可以直接创建基于文本、二进制和MTOM格式的XML写入对象。文本格式就不多说了,就是直接把XML内容写入文件,二进制和MTOM相似,都对文件内容进行压缩,说白了,是输出为纯字节形式。MTOM常用于读写SOAP消息。

    我们可以做个例子来比较一下,看看以文本方式写入XML,以及以二进制方式写入XML,它们之间的差别有多大。

    首先,定义一个枚举,用于决定是使用文本格式写入还是二进制格式写入。

        public enum WriteFormat
        {
            Text,
            Binary
        }

    然后写一个SaveXmlToFile方法,第一个参数是要保存的XML文件的路径,第二个参数是刚刚定义的枚举,用于确定写入格式。

            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();
                }
            }

    直接调用XmlDictionaryWriter的CreateXXXWriter方法,就可以得到一个XmlDictionaryWriter实例,XXX就看你要用的格式了,有Text、Binary、Mtom三种。

    当使用非文本格式写入XML时,会把XML中的文本内容存到一个叫XmlDictionary的对象来存放字符串映射,可以手动指定XmlDictionary对象,其中存放的每个字符串实例都可以用XmlDictionaryString实例来包装。

    如果我们不指定XmlDictionary实例,则Writer会自动创建,并把XML文档中的所有字符串对象(命名空间、元素名、特性名,以及文本节点的内容等)都放到XmlDictionary中映射为二进制内容。

    如果后面没有要写入的内容了,可以直接调用Flush方法,它不仅可以把缓冲的内容写入流中,而且会自动补全XML元素的结束标签。

    现在分别以文本格式和二进制格式写入XML文件。doc1.xml文件是文本格式写入的,doc2.xml是用二进制格式写入的,对比结果如下。

    相同的内容,用文本格式保存,需要99个字节,而使用二进制格式则需要36个字节。

    用记事本打开用二进制格式保存的XML文档,会看到如下内容。

    打开文本格式保存的文件,可以直接看到内容。

    好了,今天的废话就讲到这里吧,开饭了。

  • 相关阅读:
    [设计模式]之二:策略模式
    [设计模式]之一:简单工厂模式
    [iOS] WSHorizontalPickerView 图片水平滚动封装
    [闲谈] 有经验的程序员用Google用得多么?
    Flutter 布局(四)- Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth详解
    Flutter 布局(二)- Padding、Align、Center详解
    Flutter 布局(一)- Container详解
    Flutter 布局详解
    Flutter Plugin开发流程
    现有项目中集成Flutter
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/5698393.html
Copyright © 2011-2022 走看看