第二十四章 运行时序列化

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. 序列化代理 用来序列化某种类型

posted @ 2014-01-06 13:14  平常心队长  阅读(290)  评论(0编辑  收藏  举报