zoukankan      html  css  js  c++  java
  • .net 序列化反序列化

    .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 = 0; //将对象图反序列化成一组新对象 //向调用者返回对象(深拷贝)的根 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接口对 序列化对象 进行完全控制。 如果实现了这个接口,序列化时就会忽略所有定制特性。

  • 相关阅读:
    鼠标移到某个对象上,显示小手的形状
    前端开发过程中的一些小知识点总结
    滚动新闻插件vticker
    tab选项卡
    给SqlParameter参数指定或不指定:@变量标识符的区别是什么?
    c# 一个记录日志的通用方法
    DataTable和实体类通过反射相互转换
    通过计算获得一个使用最少量充值卡满足充值额度的方案
    动态规划问题
    DFS排列组合问题
  • 原文地址:https://www.cnblogs.com/dragon-L/p/5393495.html
Copyright © 2011-2022 走看看