欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#中使用DataContractSerializer类实现深拷贝操作示例

程序员文章站 2023-08-17 19:58:14
一、实现深拷贝方法 using system.io; using system.runtime.serialization; namespace deepco...

一、实现深拷贝方法

using system.io;
using system.runtime.serialization;
namespace deepcopyexp
{
  class deepcopy
  {
    public static t deepcopybydcs<t>(t obj)
    {      
      t newobject;
      using (memorystream memorystream = new memorystream())
      {
        datacontractserializer dcs = new datacontractserializer(obj.gettype());
        dcs.writeobject(memorystream, obj);
        memorystream.seek(0, seekorigin.begin);
        newobject = (t)dcs.readobject(memorystream);
      }
      return newobject;
    }
  }
}

二、测试深拷贝方法

2.1 书写测试代码

using system;
namespace deepcopyexp
{
  class program
  {
    static void main(string[] args)
    {
      student s = new student()
      {
        id = 1,
        name = "三五月儿",
        score = new score() { chinesescore =100, mathscore=100}
      };
      student s1 = deepcopy.deepcopybydcs(s);
      console.writeline("id = {0}, name = {1}, score.chinesescore = {2}, score.mathscore = {3}", s1.id, s1.name, s1.score.chinesescore, s1.score.mathscore);
    }
  }
  public class score
  {
    public int chinesescore { get; set; }
    public int mathscore { get; set; }
  }
  public class student
  {
    public int id { get; set; }
    public string name { get; set; }
    public score score { get; set; }
  }
}

代码中先实例化student类得到对象s,再使用本文给出的拷贝方法将其拷贝至对象s1并输出s1的内容,s1的内容是不是和s的内容完全一致?

2.2 运行测试代码得到下图所示结果

C#中使用DataContractSerializer类实现深拷贝操作示例

图1 程序执行结果

从结果了解到,s与s1的内容完全一致。

三、真的是深拷贝吗

为了验证这点,在代码student s1 = deepcopy.deepcopybydcs(s);的后面加入以下代码:

s.id = 2;
s.name = "sanwuyueer";
s.score = new score() { chinesescore = 0, mathscore = 0 };

使用这些代码修改对象s的值后再次输出对象s1的值,发现s1的内容并没有发生改变,说明s1是一个与s无关的新对象,确实是深拷贝。

四、datacontractserializer类实现深拷贝的原理

先使用datacontractserializer类的实例方法writeobject将对象的完整内容写入流,再使用实例方法readobject读取流内容并生成反序列化的对象。