• 第二十四章 运行时序列化


    1. 基础

    反序列化的时候,格式化器会通过调用Assembly.Load方法加载程序集,如果在序列化的时候用的是LoadFrom加载一个程序集,很可能会导致两个程序集不匹配,导出错误.

    类型需要添加Serialzable属性才能序列化.而且这个属性不能被继承.此标记可用于Class,Struct,enum,delegate.后两个默认是可序列化的,可不加标记.

    如果在序列化一个对象时,这个对象所引用的某个成员,不可序列化,会抛出异常.

    可以将这些属性添加到方法上,在序列化和反序列化的时候使用.

    System.Runtime.Serialization.OnDeserializedAttribute  如果将对象图中的对象应用于某方法,则应指定在反序列化该对象图后立即调用该方法

    OnDeserializingAttribute当将对象图应用某方法时,指定反序列化对象时调用的方法等

    在新版本中添加了新字段,会导致反序列化之前的数据时出错,可以对新添加的字段使用System.Runtime.Serialization.OptionalFieldAttribute 指定序列化流中可以缺少一个字段,这样 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter  和 System.Runtime.Serialization.Formatters.Soap.SoapFormatter 就不会引发异常

    如果类型的某个字段不需要序列化,可以添加NonSerialized属性.这个属性会被派生类型继承.

    2. 格式化器如何序列化类型实例

    通过反射查找字段和字段对应的值.

    在反序列化的时候,根据流中类型名称,找到对应的类型Type,调用GetUninitiatedObject方法,分配对象内存,但不会调用构造函数.然后对对应的字段读值赋值.

    3. Iserializable 实现序列化和反序列化,可以允许控制序列化的数据,而且可以不适用反射,效率要高.

    4. 流上下文 StreamingContext 可以设置要序列化的目的地等信息,描述给定的序列化流的源和目标,并提供一个由调用方定义的附加上下文.

    5. 将类型序列化为不同的类型以及将对象序列化为不同的对象.

    SerializationInfo.setType设置要序列化为某种类型

    IObjectReference 指示当前接口实施者是对另一个对象的引用,反序列化时返回要反序列化成的类型的实例.

    6. 序列化代理 用来序列化某种类型

  • 相关阅读:
    valgrind试用笔记
    《c++ primer》3.5 array 小结
    《c++ primer》chap8 The IO library 小结
    《c++ primer》3.4 迭代器(iterator)
    《c++ primer》3.1 声明命名空间 小结
    c++ 流格式控制符
    《c++ primer》3.3 vector 类型小结
    《c++ primer》3.2 string 小结
    Ubuntu 管理相关小知识(不定期更新)
    shell 脚本 生成文件,文件名为日期时间
  • 原文地址:https://www.cnblogs.com/zhangliming/p/3507012.html
Copyright © 2020-2023  润新知