Serialization/Deserialization Quick Start

  1. 序列化是将一个对象以及相关的对象转换成字节流的过程;反序列化就是序列化的逆过程;
  2. System.Runtime.Serialization命名空间;
  3. 当序列化一个对象时,Formatter首先抓取程序集标识,并确定程序集通过调用System.Reflection.Assembly.Load()被装载到执行的AppDomain中;
  4. 程序集被装载后,Formatter在程序集中查找待反序列化对象所匹配的类型,然后实例化再根据流来初始化实例的字段;
  5. 一些扩展程序使用Assembly.LoadFrom()来加载程序集,然后从定义在程序集中的类型来构造对象。这些对象在序列化时没有问题,但是反序列化时,Formatter会尝试使用Assembly.Load()来加载程序集,大多数情况下,CLR不能准确定位程序集文件,所以可能会引发SerializationException;
  6. 因为上面的原因,如果使用Assembly.LoadFrom()来加载程序集,那么强烈建议在反序列化之前处理System.AppDomain.AssemblyResolver事件。

Making a Type Serializable

  1. 对象在默认情况下是不能序列化的,可以通过给类型加上[Serializable]标签来实现;
  2. [Serializable]属性不能被子类型所继承;
  3. System.Object有[Serializable]属性;
  4. 一般来说,推荐大多数类型为可序列化的?(我的看法是那些可能会被跨边界访问的类型)。

Controlling Serialization and Deserialization

  1. 至少有两个原因使得你不打算让类型实例的一些字段被序列化:

    • 字段的值在反序列化时已经失效了,比如Windows Kernel对象的句柄(文件、进程、线程、互斥体、事件、信号量、……);
    • 字段的值可以在反序列化时很简单的重新计算出来。
  2. 字段加上[NonSerialized]属性标签可以阻止该字段被序列化;
  3. 如果希望字段在反序列化时被重新计算,可以定义一个方法[OnDeserialized]private void OnDeserialized(StreamingContext context){...}
  4. 跟[OnDeserialized]相似的几个属性[OnSerializing] -> [OnSerialized] -> [OnDeserializing] -> [OnDeserialized];
  5. 如果你序列化一个类型的实例,在类型中加入新的字段,然后在尝试反序列化时,Formatter会抛出SerializationException指出成员数目不对,可以通过使用[OptionalField]属性标签来解决该问题。

How Formatters Serialize Type Instances

  1. FormatterServices.GetSerializableMembers(), .GetObjectData(), GetTypeFromAssembly(), GetUninitializedObject(), .PopulateObjectMembers()静态方法。

Controlling the Serialized/Deserialized Data

  1. 如何完全的控制序列化/反序列化,可以实现System.Runtime.Serialization.ISerializable接口;
  2. 一旦类型继承了ISerializable接口,那么子类型也就必须实现该接口;
  3. 建议在GetObjectData方法和特殊构造器上附加[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]属性标签;
  4. 当Formatter在序列化对象图时,先查找每一个对象,如果有一个类型实现了ISerializable接口,Formatter就忽略其他所有的客户属性,并构造一个新的System.Runtime.Serialization.SerializationInfo对象;
  5. 总是调用SerializationInfo.AddValue来加入序列化信息到类型中,如果字段的类型实现了ISerializable接口,别在字段上调用GetObjectData,而是调用AddValue;
  6. 如果类型是sealed,那么强烈建议将特殊构造声明为private;
  7. 如果基类没有实现ISerializable接口,怎样为类型实现该接口?FormatterServices.GetSerializableMembers()。

Streaming Contexts

  1. StreamingContext.State, .Context;
  2. StreamingContextStates {CrossProcess, CrossMachines, File, Persistence, Remoting, Other, Clone, CrossAppDomain, All};

Serializing a Type as a Different Type and Deserializing an Object as a Different Object

Serialization Surrogates

  1. System.Runtime.Serialization.ISerializationSurrogate.GetObjectData(), .SetObjectData();
  2. BinaryFormatter有一个bug阻止从序列化对象到其他的引用。要解决该问题,需要传一个ISerializationSurrogate对象的引用到FormatterServices.GetSurrogateForCyclicalReference()方法;
  3. SurrogateSelector.AddSurrogate(),多个SurrogateSelector对象可以被链接起来,SurrogateSelector实现了ISurrogateSelector接口。

Overriding the Assembly and/or Type When Deserializing an Object

  1. System.Runtime.Serialization.SerializationBinder使得反序列化对象到不同的类型非常容易。要做到这点,需要定义的类型继承自抽象类SerializationBinder。

本章小结

本章讲了序列化和反序列化的知识,序列化可以讲对象转换成流进行传输或者持久化,在需要的时候通过反序列化在将对象构造出来。首先讲了如何让类型具备序列化的能力,以及如何控制序列化的过程。然后讲了Formatter如何序列化类型实例,如何控制序列化/反序列化的数据,介绍了StreamingContext对象,演示了如何将对象反序列化到不同的类型实例。接着介绍了序列化代理,最后讲了SerializationBinder抽象类可以用来反序列化对象到不同的类型。

转载于:https://www.cnblogs.com/bengxia/archive/2010/05/31/1748259.html

CLR Via C# 3rd 阅读摘要 -- Chapter 24 – Runtime Serialization相关推荐

  1. CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs

    Class Libraries and Thread Safety 线程同步是用来避免多个线程同时访问共享数据时出现冲突: 线程同步的障碍: 1.极其乏味易错: 2.锁严重影响性能: 3.线程同步锁在 ...

  2. Laravel 5文档阅读摘要

    Laravel 5项目结构分析及中文文档阅读摘要 HTTP路由 1 中间件 5 控制器 5 HTTP请求 7 HTTP 响应 8 视图 9 Service Providers 11 Service C ...

  3. 3D目标检测论文阅读摘要

    3D目标检测论文阅读摘要 2D Object Detection 的研究已经非常成熟了,代表作品有RPN系列的FasterRCNN,One Shot系列的YOLOv1-YOLOv3,这里推荐一个2D ...

  4. IDA Pro 权威指南阅读摘要1

    IDA Pro 权威指南阅读摘要1 文件加载 使用File->Open命令打开一个新文件时,会看到加载对话框. Binary File (二进制文件)是加载类型列表的最后一个选项,它是IDA加载 ...

  5. 不定积分24个基本公式_高分攻略丨语文阅读理解的24个万能答题公式

    在语文的学习中,有两大重难点,一是阅读理解,二是作文. 如果说写作可以多积累素材,想要提升作文也是很简单的,但是对于阅读理解就没有那么简单了,这个不仅需要在平时多积累,多练习,还需要答题技巧. 阅读理 ...

  6. Open-Domain Question Answering相关部分论文阅读摘要

    主要内容 Open-Domain Question Answering相关部分论文阅读摘要 DrQA(Reading Wikipedia to Answer Open-Domain Questions ...

  7. CHAPTER 24 Dialog Systems and Chatbots

    CHAPTER 24 Dialog Systems and Chatbots Speech and Language Processing ed3 读书笔记 Language is the mark ...

  8. 不定积分24个基本公式_干货丨语文阅读理解的24个万能公式,背熟6年一分不扣...

    在语文的学习中,有两大重难点,一是阅读理解,二是作文.如果说写作可以多积累素材,想要提升作文也是很简单的,但是对于阅读理解就没有那么简单了,这个不仅需要在平时多积累,多练习,还需要答题技巧. 阅读理解 ...

  9. 人工智能方向 - 贾扬清 - 阅读摘要

    人工智能方向 - 贾扬清 - 阅读摘要 http://daggerfs.com/ Tsinghua University:清华大学,清华 University of California, Berke ...

最新文章

  1. Access sql语句创建表及字段类型
  2. 2021年春季学期-信号与系统-第九次作业参考答案-第一小题
  3. pyhton列表习题
  4. springmvc+mybatis+html 下将查询数据以excell形式上传到ftp(下)
  5. 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
  6. java复制一个对象_Java中对象的复制
  7. 架构设计 | 接口幂等性原则,防重复提交Token管理
  8. 儿童手表还能这么用?定位功能防出轨 网友:这令人窒息的爱情
  9. l380废墨收集垫已到使用寿命_湖北土工网垫
  10. chrome浏览器隐藏地址栏_谷歌Chrome浏览器正在开发新功能:可直接复制粘贴隐藏密码...
  11. 答应我,安装chromedriver,按照版本号,v70就安装v2.42,
  12. aix shell脚本 运行java_IBM AIX shell脚本启动java程序不成功
  13. [转] WPF TextBox控件中文字实现垂直居中
  14. 《企业软件交付:敏捷与高效管理精要》——2.5 项目执行结果
  15. python手机号定位_利用python进行人肉搜索(一) [获取手机号]
  16. Pycharm安装jieba库
  17. AdapterView适配器
  18. Android——Binder机制
  19. Linux 并发测试工具 httpd-tools工具的安装和使用
  20. java4android 教程_《Java4Android视频教程》学习笔记(三)

热门文章

  1. python 动态规划例子
  2. ErWin简单使用说明
  3. etcd分布式之负载均衡
  4. 为啥channel能做到线程安全
  5. linux系统管理命令,压缩命令
  6. 02-CSS基础与进阶-day10_2018-09-14-20-38-10
  7. 前端技术演进(三):前端安全
  8. 不仅仅是商务旗舰,金立M2017的拍照实力同样给力
  9. FFmpegInterop 库在 Windows 10 应用中的编译使用
  10. iOS编程陷井2,模拟器不可靠