吴佳鑫的个人专栏

当日事当日毕,没有任何借口

导航

对象序列化(五):应用实例->大批量复制对象

本日记介绍序列化技术在实际开发中的用武之地。

在了解了对象序列化与反序列化的方法之后,自然想到可以使用它来实现对象复制。

当序列化技术用于对象复制时,我们不将其序列化到文件中,而是将其序列化到内存流中,通过反序列化即可“批量克隆”大量的对象。

示例:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;


namespace ObjectClone2
{
[Serializable]
class MyClass
{
public int Index = 1;
}

class Program
{
static void Main(string[] args)
{
MyClass obj = new MyClass();
//创建一个内存流对象
using (MemoryStream ms = new MemoryStream())
{
IFormatter formator = new BinaryFormatter();
formator.Serialize(ms, obj); //将对象序列化到内存流中

//克隆100个对象
for (int i = 0; i < 100; i++)
{
ms.Seek(0, SeekOrigin.Begin);//回到流的开头
obj = (formator.Deserialize(ms) as MyClass); //反序列化对象
obj.Index += i; //设置对象字段
Console.WriteLine("对象{0}已创建。", obj.Index);
}
}
Console.ReadKey();
}
}
}

使用上述技术克隆对象时,要注意以下几点:

1.需要克隆的类必须标记为 [Serializable]。

2.每次反序列化结束都要把内存流的读写指针移回开头。

3.对于 拥有组合关系的对象,要求所有参与组合的类都必须要有[Serializable]标记。

4.此技术完成的是对象“深复制”,因此如果对象之间是一种循环引用包含关系,程序运行时将会导致堆栈溢出,抛出一个 StackOverflowException异常。

posted on 2012-02-14 23:50  _eagle  阅读(697)  评论(0编辑  收藏  举报