.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. FireDAC 接占线导致另一个 hstmt DataSnap

    [FireDAC][Phys][ODBC][Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt 同样的程序,在2台win10 正常,1台win10 报连 ...

  2. 跟我学算法聚类(kmeans)

    kmeans是一种无监督的聚类问题,在使用前一般要进行数据标准化, 一般都是使用欧式距离来进行区分,主要是通过迭代质心的位置 来进行分类,直到数据点不发生类别变化就停止, 一次分类别,一次变换质心,就 ...

  3. AnimatorController即动画控制器创建的BUG

    //-------------------------------------------------------------------------------------------------- ...

  4. C#枚举最优雅的用法

    public enum AbilityLevel { /// <summary> /// Indicates that the individual has a general knowl ...

  5. $.getJSON() 回调函数没有执行的原因

    $.getJSON() 方法使用 AJAX 的 HTTP GET 请求获取 JSON 数据. 语法 $.getJSON(url,data,success(data,status,xhr)) url必填 ...

  6. Vertex and fragment programs

    [Vertex and fragment programs] When you use vertex and fragment programs (the so called "progra ...

  7. spark属性

    应用属性 属性名 缺省值 意义 spark.app.name (none) The name of your application. This will appear in the UI and i ...

  8. SEL 类型

    1.SEL类型的第一个作用, 配合对象/类来检查对象/类中有没有实现某一个方法 SEL sel = @selector(setAge:); Person *p = [Person new]; // 判 ...

  9. [erlang 002]gen_server中何时会跑到terminate函数

    一.从start方法产出的独立gen_server进程 实验代码: %%%-------------------------------------- %%% @Module  : %%% @Auth ...

  10. 导入txt文件到SQL SERVER 2008

    最近在学习数据库,想要试处理大量数据.大量的数据手动输入是不可能的了,所以需要导入.本人上网看了不少的教程,然后下载了txt格式的一万条彩票开奖记录数据.但是把这些数据导入到SQL Server 20 ...