C#中序列化和反序列化

1. 简介
对象序列化是将对象(比如Person对象)转换为二进制数据
反序列化是将二进制数据还原为对象。
对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。

BinaryFormatter类有两个方法:

void Serialize(Stream stream, object graph)  对象graph序列化到stream中
object Deserialize(Stream stream)            将对象从stream中反序列化,返回值为反序列化得到的对象

序列化:

BinaryForatter bf = new BinaryForatter();
using(Stream stream = File.OpenWrite(@"C:\1.dat"))
{
    bf.Serialize(stream, obj);
}

反序列化

using(Stream stream = File.OpenRead(@“C:\1.dat”))
{
    object obj = bf.Deserialize(stream);
}


不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化。
反序列的项目中必须有同样的类,否则不能反序列化。

2. 序列化的应用:
ASP.Net、ViewState、WCF、.Net Remoting、ASP.Net Cache 、集群等。

扩展阅读:
(1)http://www.yaosansi.com/post/1061.html  
(2)http://blog.sina.com.cn/s/blog_645752e60100h4w9.html

3. 面试题
深度拷贝。浅层拷贝。先手写浅层拷贝、深层拷贝的代码,理解了概念再谈用MemberwiseClone 、DeepCopy。见备注
写代码拷贝,实现ICloneable方法,内部调用MemberwiseClone  

        static object DeepCopy(object src)
        {
            BinaryFormatter Formatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
            using (MemoryStream stream = new MemoryStream())
            {
                Formatter.Serialize(stream, src);
                stream.Position = 0;
                return Formatter.Deserialize(stream);
            }
        }

  

posted @ 2013-03-17 22:51  liqipeng  阅读(274)  评论(0编辑  收藏  举报