zoukankan      html  css  js  c++  java
  • 创建对象的序列化文件 SoapFormatter,binaryFormatter以及XmlSerializer序列化文件的比较

    序列化本身就是要将对象转换成为数据流, 这样便于存储和传输.

    SoapFormatter和binaryFormatter都是一种Formatter,原本我以为XmlSerializer也是继承了IFormatter接口,后来发现不是.

    关于formatter和Iformatter,可以到命名空间 System.Runtime.Serialization.Formatters 查看

    关于使用比较

    // create a file stream to write the file
    FileStream fileStream = new FileStream("DoSum.bin", FileMode.Create);
    // use the CLR binary formatter
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    // serialize to disk
    binaryFormatter.Serialize(fileStream, sObj);
    fileStream.Close();

    xmlSerializer 比较不同

    // create a file stream to write the file
                FileStream fileStream = new FileStream("DoSum.xml", FileMode.Create);
                // use the CLR binary formatter
                System.Xml.Serialization.XmlSerializer
                    formatter = new XmlSerializer(typeof(SumOf));
                // serialize to disk
                formatter.Serialize(fileStream, sObj);
                fileStream.Close();

     

    可以使用(定义)不同的格式器来创建对象的序列化.

    比如 SoapFormatter, binaryFormatter

    当然也可以完全继承一个Formatter来定义自己的格式化器.

    SoapFormatter, binaryFormatter 是无法继承的,它们是实现了 IFormatter接口, 而xmlSerializer没有实现接口IFormatter,但我们可以定义类继承于它

    序列化导出内容的不同.

    如果我们想控制序列化出来的内容,我们有两个途径来控制, 一个是定义自己的格式化器,另一个则是被序列化对象实现接口 System.Runtime.Serialization.ISerializable.

    格式化器里面有一个方法:

    public override void Serialize(System.IO.Stream serializationStream, object graph)

    ISerializable 里面有一个方法:

    public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)

    需要注意的是, 尽管对象实现了ISerializable, 如果使用xmlSerializer导出内容仍然不变.

    注意以下文字

    序列化过程的步骤
    在格式化程序上调用 serialize 方法时,对象序列化按照以下规则进行:
    检查格式化程序是否有代理选取器。如果有,检查代理选取器是否处理指定类型的对象。如果选取器处理此对象类型,将在代理选取器上调用 iserializable.getobjectdata。
    如果没有代理选取器或有却不处理此类型,将检查是否使用 serializable 属性对对象进行标记。如果未标记,将会引发 serializationexception。
    如果对象已被正确标记,将检查对象是否实现了 iserializable。如果已实现,将在对象上调用 getobjectdata。
    如果对象未实现 serializable,将使用默认的序列化策略,对所有未标记为 nonserialized 的字段都进行序列化。

     

    关于对象序列化,可以在网上搜索一下这篇文章<<.NET 中的对象序列化>>

    我这里有一个问题, 最近传送一个dataset的时候,我直接使用的 datatset.getxml()获取的序列文件,是否可以自己定义一个formatter来序列它呢?

  • 相关阅读:
    合并两个有序列表
    根据前序遍历和中序遍历还原二叉树
    快速排序
    二叉树搜索的后序遍历序列
    最长回文子串
    爬楼梯
    Selenium EC 与 Wait
    爬取Django 绕过csrf实现批量注册
    Django 数据传递 个人汇总贴
    python bytes和str转换
  • 原文地址:https://www.cnblogs.com/king_astar/p/900394.html
Copyright © 2011-2022 走看看