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); } }
本博客(liqipeng)除非已明确说明转载,否则皆为liqipeng原创或者整理,转载请保留此链接:https://www.cnblogs.com/liqipeng/archive/2013/03/17/4576176.html。
本博客(liqipeng)除非已明确说明转载,否则皆为liqipeng原创或者整理,转载请保留此链接:https://www.cnblogs.com/liqipeng/archive/2013/03/17/4576176.html。
如果你觉得这篇文章对你有帮助或者使你有所启发,请点击右下角的推荐按钮,谢谢,:)