首页 > 其他分享 >对象拷贝方法

对象拷贝方法

时间:2023-08-15 17:25:52浏览次数:33  
标签:obj MemoryStream 对象 retval return ms new 拷贝 方法

C#中4种深拷贝方法介绍
概述
 为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做。

1、利用反射实现
public static T DeepCopy(T obj)
{
//如果是字符串或值类型则直接返回
if (obj is string || obj.GetType().IsValueType) return obj;

object retval = Activator.CreateInstance(obj.GetType());
FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
foreach (FieldInfo field in fields)
{
try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }
catch { }
}
return (T)retval;
}

2、利用xml序列化和反序列化实现
public T DeepCopy(T obj)
{
object retval;
using (MemoryStream ms = new MemoryStream())
{
XmlSerializer xml = new XmlSerializer(typeof(T));
xml.Serialize(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
retval = xml.Deserialize(ms);
ms.Close();
}
return (T)retval;
}
3、利用二进制序列化和反序列化实现
public static T DeepCopy(T obj)
{
object retval;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
//序列化成流
bf.Serialize(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
//反序列化成对象
retval = bf.Deserialize(ms);
ms.Close();
}
return (T)retval;
}

4、DataContractSerializer实现
利用silverlight DataContractSerializer实现,用于在silverlight 客户端使用

public static T DeepCopy(T obj)
{
object retval;
using (MemoryStream ms = new MemoryStream())
{
DataContractSerializer ser = new DataContractSerializer(typeof(T));
ser.WriteObject(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
retval = ser.ReadObject(ms);
ms.Close();
}
return (T)retval;

标签:obj,MemoryStream,对象,retval,return,ms,new,拷贝,方法
From: https://www.cnblogs.com/MachineVIsion-w/p/17631867.html

相关文章

  • Asp.net WebAPI中Controller的方法在接受到json时序列化都为null的问题
    原因是,webapi默认不序列化字段,只序列化属性只需要把字段改成属性即可 ------------------改成---------------- ......
  • linux jdk 不生效解决方法
    1.安装jdk1.8。2.修改/etc/profile中的JAVA_HOME为新的jdk路径,并执行source/etc/profile。3.执行java-version,这个时候显示jdk还是1.7版本。4.执行:whichjavawhichjavac  将以上两条指令执行结果中的java、javac文件删除。5.执行:ln-s$JAVA......
  • 工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)
    前言简单工厂模式和工厂模式的区别 简单工厂模式:也叫做静态工厂模式,可创建多个实现类,简单工厂模式实现了创建实现类的代码跟客户端分离,在工厂类里面可以添加所需生成实现类的逻辑; 缺点是每次增加一种实现类,都需要修改工厂类,不符合开闭原则;上期我发了一篇简单工厂模式练习......
  • Centos-国内常用源和离线环境的下载安装方法
    开始之前简单讲下源和包管理器的概念,个人理解如下:源就是平时我们win电脑上的360软件管家、腾讯软件管家、微软商店这个意思,提供下载各类软件包、安装包的平台;包管理器就是win电脑上各类软件的安装包,例如qq.exe、360.msi等,需要下载后用指定的命令可以进行安装、协助等操作,跟源配......
  • python 面向对象 继承
     https://cloud.tencent.com/developer/article/1915788修改代码以解决报错classClass_1():  var_1=1    def__init__(self):    self.var_2=var_1classClass_2(Class_1):    def__init__(self):    self.var_4=self.var......
  • 8-15| _ctypes.COMError: (-2147352567, '发生意外。', ('无法获取 Document 对象', '
    此错误是一个COM错误,它与试图从Python通过`pyautocad`与AutoCAD通信时出现的问题有关。错误信息"无法获取Document对象"指示了问题的本质,即Python无法访问AutoCAD的当前文档。这里有一些建议来解决这个问题:1.**确保AutoCAD已经运行**:在尝试从Python访问Aut......
  • PPT| 企业架构TOGAF 4A 架构规划方法 P74
    PPT共74页,由于篇幅有限,以下为部分资料.......
  • ServiceLocatorFactoryBean获取Bean方法
    对于不同输入需要调用不同实现类,可以考虑使用ServiceLocatorFactoryBean定义一个interface代理接口(根据类型来判断选择哪一个实现)publicinterfaceBeanFactory{//type是具体Bean类型TestBeanFactoryget(Stringtype);}定义ServiceLocatorFactoryBean定位配置类@Con......
  • mysql添加索引的方法(Navicat可视化加索引和sql语句加索引)
    mysql添加索引的方法(Navicat可视化加索引和sql语句加索引) 使用索引的场景:阿里云日志里出现了慢sql 然后发现publish_works_id字段会经常用于一些关联,所以决定把这个字段加上索引,优化sql可视化navicat操作字段加索引,选择字段所在的表,第一步:右键->设计表第二步......
  • 产品帮助中心的制作方法,保姆级0-1完整的实操教程!
    帮助中心是一个产品的重要用户自助服务模块,包括各类产品相关信息,用以帮助用户快速理解和使用产品功能。对于我们产品开发和管理者而言,设计帮助中心的初衷是解决用户困惑,怎么设计帮助中心,才能让其价值尽可能的大,这是我们要深度思考的。 产品帮助中心开发今天就结合HelpLook这款工具......