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 指示当前接口实施者是对另一个对象的引用,反序列化时返回要反序列化成的类型的实例.