.net 序列化创建对象的深拷贝

   public static object DeepClone(object original)
{
using (MemoryStream stream = new MemoryStream())
{
//构造序列化格式化器来执行所有实习工作
BinaryFormatter formatter = new BinaryFormatter();
//流上下文
formatter.Context = new StreamingContext(StreamingContextStates.Clone); //将对象图序列化到内存流中
formatter.Serialize(stream, original); //反序列化前,定位到内存流的起始位置
stream.Position = ; //将对象图反序列化成一组新对象
//向调用者返回对象(深拷贝)的根
return formatter.Deserialize(stream); }
}

序列化可以将多个对象图序列化到一个流中, 在反序列化时按顺序取出即可。

控制序列化反序列化:

有时我们希望类型中有些属性或者字段不被序列化:通过

NonSerialized特性来控制:

   [NonSerialized]
     private double m_area;

OnDeserialized特性:

     根据字段值初始化 ,可以将序列化后的值正确的设置。

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

自动序列化

1. 调用 FormatterServices的GetSerializableMembers方法。这个方法利用反射获取类型的public 和private实例字段(标记了NonSerializedAttribute特性的字段除外)

。方法返回由MemberInfo对象构成的数组。

2. 对象被序列化。

3. 格式化器将程序集标示和类型的完整名称写入流。

 4. 格式化器遍历两个数组中的元素,将每个成员的名称和值写入流。

自动反序列化

1. 格式化器从流中读取数据程序集标示和完整名称,如果当前程序集没有加载到AppDomain中,就加载它。如果程序集不能加载就会抛异常。

2. 格式化器调用FormatterServices的静态方法GetUninitializedObject:

3. 格式化器构造一个并初始化一个MemberInfo数组。

4. 格式化器根据流中包含的数据创建并初始化一个Object数组。

5. 分配对象。

控制序列化反序列化的数据:

通过ISerialiazble接口对 序列化对象 进行完全控制。 如果实现了这个接口,序列化时就会忽略所有定制特性。

.net 序列化反序列化的更多相关文章

  1. php json与xml序列化/反序列化

    在web开发中对象的序列化与反序列化经常使用,比较主流的有json格式与xml格式的序列化与反序列化,今天想写个jsop的小demo,结果发现不会使用php序列化,查了一下资料,做个笔记 简单数组js ...

  2. 序列化反序列化api(入门级)

    定义: java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 为什么字符串通常也会进行序列化? 对象需要进行序列化的原因:保证对象的状态不变 ...

  3. python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理

    python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...

  4. C#之你懂得的序列化/反序列化

    前言:写此文章一方面是为了巩固对序列化的认识,另一方面是因为本人最近在面试,面试中被问到“为什么要序列化”.虽然一直在使用,自己也反复的提到序列化,可至于说为什么要序列化,还真的没想过,所以本文就这样 ...

  5. springboot学习(三)——http序列化/反序列化之HttpMessageConverter

    以下内容,如有问题,烦请指出,谢谢! 上一篇说掉了点内容,这里补上,那就是springmvc的http的序列化/反序列化,这里简单说下如何在springboot中使用这个功能. 使用过原生netty ...

  6. java序列化反序列化深入探究

    When---什么时候需要序列化和反序列化: 简单的写一个hello world程序,用不到序列化和反序列化.写一个排序算法也用不到序列化和反序列化.但是当你想要将一个对象进行持久化写入文件,或者你想 ...

  7. java序列化反序列化深入探究(转)

    When---什么时候需要序列化和反序列化: 简单的写一个hello world程序,用不到序列化和反序列化.写一个排序算法也用不到序列化和反序列化.但是当你想要将一个对象进行持久化写入文件,或者你想 ...

  8. C# XML序列化/反序列化参考

    .NET提供了很不错的XML序列化/反序列化器,(它们所在的命名空间为System.Xml.Serialization)这是很方便的,下面对它的使用做一些总结,以供参考. 1,简单序列化 public ...

  9. 二进制数据的序列化反序列化和Json的序列化反序列化的重要区别

    前言:最近一个一个很奇怪的问题,很明白的说,就是没看懂,参照下面的代码: /// <summary> /// 反序列化对象 /// </summary> /// <typ ...

  10. 序列化 反序列化 MessagePack for C#

    阅读目录 快速序列化组件MessagePack介绍 简介 使用 快速开始 分析器 内置的支持类型 对象序列化 DataContract兼容性 序列化不可变对象(序列化构造器) 序列化回调 Union ...

随机推荐

  1. MATLAB常用方法技巧总结

    ===================================================================================================M ...

  2. 「小程序JAVA实战」java-sesion的状态会话与无状态会话(38)

    转自:https://idig8.com/2018/09/02/xiaochengxujavashizhanjava-sesiondezhuangtaihuihuayuwuzhuangtaihuihu ...

  3. oracle对表常用的操作

    最近业务需要给表添加索引,因为数据量很大时,查询效率很低:老大建议使用索引: 之前总结的时候将索引没有记录,当然啦,也怪笔者基础薄弱,不管了,慢慢进步嘛,好了进入正题吧! 首先准备工作,先建两个临时表 ...

  4. python算法之希尔排序

    希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 希尔 ...

  5. a different object with the same identifier value was already associated with the session解决方案

    org.springframework.orm.hibernate3.HibernateSystemException: a different ]; nested exception ] at or ...

  6. linux下in命令

    1.用法 : ln [option] source_file dist_file -f 建立时,将同档案名删除.               -i 删除前进行询问.               ln ...

  7. 数组和集合(三):Set集合的使用总结

    一.概述 · 继承collection接口 · 无序(不记录添加顺序).不允许元素重复.只允许存在一个null元素 二.实现类 1. HashSet · 底层其实是包装了一个HashMap实现的 · ...

  8. Sso单点登录分析

    1.   Sso系统分析 1.1. 什么是sso系统 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这 ...

  9. js对象的几种创建方式和js实现继承的方式[转]

    一.js对象的创建方式 1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性值. var person = new Object(); ...

  10. 详解C++右值引用

    C++0x标准出来很长时间了,引入了很多牛逼的特性[1].其中一个便是右值引用,Thomas Becker的文章[2]很全面的介绍了这个特性,读后有如醍醐灌顶,翻译在此以便深入理解. 目录 概述 mo ...