用序列化实现List<T> 实例的深复制(推荐)

如果 List<T> 里的 T 是引用类型(如myClass类),则在 像这种写法:

 List<myClass> lists1 = new List<myClass>()

 {

    new myClass(),

    new myClass()

 };

List<myClass> lists2 = new List<myClass>(lists1 );

其实是一个浅复制的过程。

如果要实现深复制,通过有几种做法,可以用foreach, 或者重写Clone()方法。

但最好用和最方便的方法还是使用【序列化】的方式来实现。

序列化是指将对象转换为字节流的形式,然后保存在内存或者数据库中。序列化可以保存对象的状态信息,当需要使用的时候在反序列化回来。所以将对象序列化可以存储和交换数据。例如如果web 服务发送,或者在应用程序从这个域发送到另一个域。

若要序列化对象,您需要待序列化的对象、要包含序列化对象的流,以及一个Formatter。序列化包括:二进制序列化和 xml 序列化。

例如,使用 XmlSerializer ,将要拷贝的对象序列化到流中,然后通过反序列化得到新的对象。

  /// <summary>
  /// 序列化类
  /// </summary>
  public class SerializLog
  {
    //1.使用序列化的方式完成 引用对象的 深复制 是最好的方式
    //2.下面的 Clone方法,我需要使用 泛型对象 做为参数,则在 Clone后面需要带上<T>的声明,否则编译出错

    public static T Clone<T>(T realObject) // T 要序列化的对象
    {
      using (Stream stream = new MemoryStream()) // 初始化一个 流对象
      {
        XmlSerializer serializer = new XmlSerializer(typeof(T)); //将要序列化的对象序列化到xml文档(Formatter)
        serializer.Serialize(stream, realObject); //将序列后的对象写入到流中
        stream.Seek(0, SeekOrigin.Begin);
        return (T)serializer.Deserialize(stream);// 反序列化得到新的对象
      }
    }
  }

以上这篇用序列化实现List 实例的深复制(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C#实现的序列化通用类实例

    本文实例讲述了C#实现的序列化通用类.分享给大家供大家参考.具体如下: using System; using System.IO; using System.IO.Compression; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; using System.Text; using System.Xml; using Syste

  • c#对象反序列化与对象序列化示例详解

    1.对象序列化的介绍 (1).NET支持对象序列化的几种方式二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下.SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的.XML

  • C#实现json的序列化和反序列化实例代码

    在做asp.net和unity进行http通信的时候,当unity客户端发出表单请求的时候,我要将他要请求的数据以json的格式返回给客户端,让客户端来解析.服务器端这一块就涉及到json的序列化和反序列化的问题. 两种方法都有例子,第一种是用泛型集合来存储的对象,然后将集合序列化一下:第二种是直接序列化的一个对象 复制代码 代码如下: using System;using System.Collections.Generic;using System.Web.Script.Serializat

  • .NET的深复制方法(以C#语言为例)

    很多时候我们复制一个对象实例A到实例B,在用实例B去做其他事情的时候,会对实例B进行修改,为保证对B的修改不会影响到A的正常使用,就需要使用到深复制. 我在网上搜到一些深复制的方法,同时写了几组例子对这些方法进行测试. 我的操作系统版本为Win7旗舰版,.NET Framework版本是4.5 测试程序 我建了一个C#窗体应用程序(Winform),其主窗口FormMain的Load函数内容如下: private void FormMain_Load(object sender, EventAr

  • C#复制和深度复制的实现方法

    深度复制与浅表复制的区别在于,浅表复制只复制值类型的值,而对于实例所包含的对象依然指向原有实例. class Program { [Serializable] public class Car { public string name; public Car(string name) { this.name = name; } } [Serializable] public class Person:ICloneable { public int id; public string name;

  • 用序列化实现List<T> 实例的深复制(推荐)

    如果 List<T> 里的 T 是引用类型(如myClass类),则在 像这种写法: List<myClass> lists1 = new List<myClass>() { new myClass(), new myClass() }; List<myClass> lists2 = new List<myClass>(lists1 ); 其实是一个浅复制的过程. 如果要实现深复制,通过有几种做法,可以用foreach, 或者重写Clone()方

  • PHP中的浅复制与深复制的实例详解

    PHP中的浅复制与深复制的实例详解 前言: 最近温习了一下Design Pattern方面的知识,在看到Prototype Pattern这一设计模式时,注意到其中涉及到一个浅复制与深复制的问题.这里来总结一下,提醒自己以后一定要多加注意. 自PHP5起,new运算符自动返回一个引用,一个 对象变量 已经不再保存整个对象的值,只是保存一个标识符来访问真正的对象内容.当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这

  • Java对象深复制与浅复制实例详解

     Java对象深复制与浅复制实例详解 我们在遇到一些业务场景的时候经常需要对对象进行复制,对于对象的复制一般有两种方式,深复制和浅复制 浅复制:对象的复制仅是对象本身,对象引用的其它对方并不会复制. 深复制:对象的复制包含对象引用的对象. Java所有对象的基类提供了clone方法,但是这个方法是protected native修饰,因此只暴露给之类去重写,外部是无法直接调用的. 我们现在来测试两种复制,首选是浅复制,浅复制要实现Cloneable接口. // 课程对象 class Class

  • php5对象复制、clone、浅复制与深复制实例详解

    本文实例讲述了php5对象复制.clone.浅复制与深复制.分享给大家供大家参考,具体如下: 对象复制的由来 为什么对象会有"复制"这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 PHP代码 /** * 电视机类 */ class Television { /** 屏幕高度 */ protected $_screenLength = 300; /** 屏幕宽度 */ protected $_screenHight = 200; /** 电视机外观颜色

  • PHP对象的浅复制与深复制的实例详解

    PHP对象的浅复制与深复制的实例详解 最近在看原型模式时注意到这个问题~~PHP中对象 '=' 与'clone'的区别 实例代码: //聚合类 class ObjA { public $num = 0; public $objB;//包含的对象 function __construct() { $this->objB = new ObjB(); } //只有实现了下面方法聚合类 才能实现深复制 /*function __clone() { $this->objB = clone $this-&

  • C++对象的浅复制和深复制详解及简单实例

    C++对象的浅复制和深复制详解及简单实例 浅复制:两个对象复制完成后共享某些资源(内存),其中一个对象的销毁会影响另一个对象 深复制:两个对象复制完成后不会共享任何资源,其中一个对象的销毁不会影响另一个对象 下面我们来看一段代码,以便直观的理解: #include<iostream> #include<string.h> using namespace std; class Student { int no; char *pname; public: Student(); Stud

  • PHP 序列化和反序列化函数实例详解

    序列化与反序列化 把复杂的数据类型压缩到一个字符串中 serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量 1.创建一个$arr数组用于储存用户基本信息,并在浏览器中输出查看结果: $arr=array(); $arr['name']='张三'; $arr['age']='22'; $arr['sex']='男'; $arr['phone']='123456789'; $arr['address']='上海市浦东新区'; var_dump($arr):

  • js表单序列化判断空值的实例

    学习javaweb的时候,做了将页面上的的表单信息添加到数据库中的练习.提交表单的时候,需要保证每个输入框.单选按钮.复选框等都不为空,刚开始的时候挨个获取控件的值进行判断是否为空,后来认识了表单序列化这么一个方法,就是了下用序列化来判断空值 //form表单页面 <form id="basicInfo" action="EmployeeServlet?flag=addEmployeeInfo" method="post"> <

  • Java中对象的序列化详解及实例

     Java中对象的序列化详解及实例 把java对象转化为字节序列的过程称为对象的序列化. 把字节序列恢复为java对象的过程称为对象的反序列化. 对象序列化的用途: 1.把对象的字节序列永久的保存到硬盘上,通常存放在一个文件中 2.在网络上传送对象的字节序列化 void writeObject(Object obj) 方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中(将指定的对象写入 ObjectOutputStream.) void readObject()方法 从

  • Java 浅复制和深复制的实例详解

    Java 浅复制和深复制的实例详解 1 浅复制和深复制区别 浅复制:浅复制只是复制本对象的原始数据类型,如int.float.String,对于数组和对象引用等是不会复制的.因此浅复制是有风险的. 深复制:不但对原始数据类型进行复制,对于对象中的数组和对象引用也做复制的行为,从而达到对对象的完全复制. 2 代码示例 package com; import java.util.ArrayList; public class Test implements Cloneable { // 私有属性 p

随机推荐