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 运行测试代码得到下图所示结果
图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读取流内容并生成反序列化的对象。
下一篇: C#中foreach语句深入研究