c# 对象的深拷备
C# 引用类型对象在拷备时,一般有浅拷备与深拷备,浅拷备指向的是同一对象的引用地址,一个对象的修改必然会影响另一个对象,而深拷备是直接拷备对象的内容,而不是引用,拷备后的对象拥有新的引用,这里主要介绍深拷备的实现,其实现 方式有3种,好了直接上代码:
1. 首先定义一个类:
using System;
using System.IO;
namespace DemonCol
{
[Serializable] // 可序列化标记
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
public FileMode MyFileMode { get; set; }
}
}
2. 定义深拷备方法
方法1: 通过序列化与反序列化实现深拷备
需要添加的引用: using System.Runtime.Serialization.Formatters.Binary; using System.IO; using System.Runtime.Serialization;
Person 类的头部必须添加标记: [Serializable]
/// <summary>
/// 通过序列化与反序列化实现深拷备
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static T DeepCopyBySerialize<T>(T obj)
{
object returnObj;
using (MemoryStream ms = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
returnObj = formatter.Deserialize(ms);
ms.Close();
}
return (T)returnObj;
}
方法2: 通过 XML 序列化与反序列化实现 深拷备
需要添加的引用: using System.Xml.Serialization;
Person 类的头部可不用 标记:[Serializable]
/// <summary>
/// 通过 XML 序列化与反序列化实现 深拷备
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static T DeepCopyByXmlSerialize<T>(T obj)
{
object returnObj;
using (MemoryStream ms = new MemoryStream())
{
XmlSerializer xs = new XmlSerializer(typeof(T));
xs.Serialize(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
returnObj = xs.Deserialize(ms);
ms.Close();
}
return (T)returnObj;
}
方法3: 通过 反射实现 深拷备
需要添加的引用: using System.Reflection;
Person 类的头部 可不用 标记:[Serializable]
/// <summary>
/// 通过 反射实现 深拷备
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static T DeepCopyByReflection<T>(T obj)
{
if (obj is string || obj.GetType().IsValueType)
return obj;
object returnObj = Activator.CreateInstance(obj.GetType());
FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
foreach (FieldInfo item in fields)
{
try
{
item.SetValue(returnObj, DeepCopyByReflection(item.GetValue(obj)));
}
catch { }
}
return (T)returnObj;
}
3. 客户端测试
static void Main(string[] args)
{
Person person = new Person();
person.Age = 20;
person.Name = "will";
person.MyFileMode = FileMode.Create; Person person2 = person;
Person person3 = DeepCopyBySerialize<Person>(person); person.Name = "modify";
person.Age = 10;
person.MyFileMode = FileMode.Open;
Console.ReadKey();
}
运行结果:
参考文章: http://www.jb51.net/article/67992.htm
c# 对象的深拷备的更多相关文章
- java复制对象之深拷背
在java开发中,有时我们需要复制对象,并且确保修改复制得到的对象不会影响原来的对象. 于是,有些人可能会写出类似以下的代码: public class CloneTest { public stat ...
- 超实用的JavaScript代码段 Item8 -- js对象的(深)拷贝
js 对象 浅拷贝 和 深拷贝 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: var Chinese = { nation:'中国' } var Doctor ...
- 数往知来C#之 String 集合 深拷与浅拷 序列化<五>
C# 基础常用string方法篇 复习. 1.引用类型与值类型 -->文件的复制与快捷方式的复制 2.垃圾回收 3.静态与非静态 -->如何定义静态成员与静态类 --> ...
- Java中对象的深复制和浅复制详解
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...
- 使用scp命令,不同服务器之间拷备文件
使用scp命令,不同服务器之间拷备文件 先将源服务器,目标服务器安装scp服务 yum -y install openssh-clients 命令格式 scp source dist usage: s ...
- Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:
OC内部:可变对象和不可变对象的深(复制)拷贝问题思考: 不可变对象: 例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向 ...
- java对象实现深复制的方法
p2 = (Person)org.apache.commons.lang3.ObjectUtils.cloneBean(p); Person p2 = new Person(); p2 = (Pers ...
- JavaScript 对象的深复制
对象的深复制 源对象的属性更改,不会引起复制后的对象个属性的更改 源对象的任何属性与子属性与新对象的之间没有任何引用关系 Coding: /* 对象的深复制: 1 初始化目标对象 如果没有指定目标对象 ...
- js 复制对象的深复制与浅复制
1.潜复制(修改新对象会改变原对象) var baz = {a:'hello', b: {c:'my', d:'friend'}} var foo = baz foo.a="better&q ...
随机推荐
- spring注入3种方式
1.构造方法 2.接口注入 3.set方法
- oracle中 trunc 处理日期的用法
方法/步骤 1 select trunc(sysdate) from dual 结果是 截止到当日 不设置,默认是截止到”日“ 2 select trunc(sysdate,'year') fr ...
- Java框架部分---面试题
说说Spring? Spring的核心是控制反转.依赖注入,Aop(面向切面)相当于把每个bean与bean之间的关系交给第 三方容器进行管理. 说SpringIOC.SpringAOP? Sprin ...
- spring注解实现防盗链拦截
首先配置 applicationContext.xml, 添加 <!-- 启用 @AspectJ --> <aop:aspectj-autoproxy /> 新建Java工具类 ...
- 【转载】GET和POST两种基本请求方法的区别
原文地址:http://www.cnblogs.com/logsharing/p/8448446.html GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一 ...
- php 安装redis
https://www.cnblogs.com/yuuje/p/8243234.html
- ubuntu 网络配置
检查网络配置命令:ifconfig 一.通过配置文件配置 新手没怎么用过Ubuntu,所以走了不少弯路,网上找了很多方法,大都没对我起到帮助作用,所以把自己的配置方法写一写. Ubuntu上连了两块网 ...
- OperateResult 基础类及派生类介绍
前言 在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装: Install-Package HslCommunication NuGet安 ...
- java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver
在使用JDBC时经常碰到java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver问题 这是jvm找不到驱动类文件,可能是以下原因: 没有导入驱 ...
- CH3401 石头游戏(矩阵快速幂加速递推)
题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...