序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。序列化和反序列化最主要的作用有:
1、在进程下次启动时读取上次保存的对象的信息
2、在不同的AppDomain或进程之间传递数据
3、在分布式应用系统中传递数据
引用:http://www.cnblogs.com/ejiyuan/archive/2009/01/21/1379256.html
1.给要序列化的类加上Serializable特性
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.IO;
usingSystem.Runtime.Serialization;
usingSystem.Runtime.Serialization.Formatters.Binary;
//序列化靠反射实现namespaceSerializeExsample
{
//序列化就是将对象转换为容易传输的格式在各个程序之间共享
//必须给可序列化的对象加上Serializable特性[Serializable]
publicclassUser
{
//[NonSerialized]只能在字段上加上该特性表示不会序列化字段publicstringName{get;set;}
publicintAge{get;set;}
}
classProgram
{
staticvoidMain()
{
//SerailizeUseruser=newUser{Name="Sonven",Age=35};
BinaryFormatterformat=newBinaryFormatter();
Streamstream=newFileStream("temp.t",FileMode.Create);
format.Serialize(stream,user);//参数为一个Stream,objectstream.Dispose();
//Deserializestream=newFileStream("temp.t",FileMode.Open,FileAccess.Read);
Usernewuser=format.Deserialize(stream)asUser;//Deserializeif(newuser!=null)Console.WriteLine("Deserializeuser:Name{0},Age{1}",newuser.Name,newuser.Age);
stream.Dispose();
File.Delete("temp.t");//DeleteTempDataConsole.ReadKey();
}
}
}
2.实现序列化接口
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.IO;
usingSystem.Runtime.Serialization;
usingSystem.Runtime.Serialization.Formatters.Binary;
namespaceSerializeExsample.Custorm
{
[Serializable]
publicclassUser:ISerializable
{
publicstringName{get;set;}
publicintAge{get;set;}
publicUser(){}
//反序列化
//此构造函数用于创建反序列化后的对象publicUser(SerializationInfoinfo,StreamingContextcontext)
{
//SerializationInfo的Value键值区分大小些,如果Age改为age将抛出错误Age=(int)info.GetValue("Age",typeof(int));
//Name=info.GetValue("Name",typeof(string))asstring;}
//序列化,在里面添加要被序列化的属性
//实现ISerializable的GetObjectData方法publicvoidGetObjectData(SerializationInfoinfo,StreamingContextcontext)
{
info.AddValue("Age",this.Age);
//info.AddValue("Name",this.Name);}
}
classProgram
{
staticvoidMain()
{
Useruser=newUser{Name="Jack",Age=22};
//SerializeBinaryFormatterformat=newBinaryFormatter();
Streamstream=newFileStream("temp.t",FileMode.Create);
format.Serialize(stream,user);
stream.Dispose();
//Deserializestream=newFileStream("temp.t",FileMode.Open,FileAccess.Read);
user=format.Deserialize(stream)asUser;
stream.Dispose();
if(user!=null)Console.WriteLine("DeserializeduserName:{0},Age:{1}",user.Name,user.Age);
Console.ReadKey();
//反序列后的对象Name为null,Age为22}
}
}
3.使用XMLSerializer
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.IO;
usingSystem.Xml;
usingSystem.Xml.Serialization;
namespaceSerializeExsample.Xml
{
publicclassUser
{
publicstringName{get;set;}
publicintAge{get;set;}
[XmlIgnore]//忽略对属性序列化publicDateTimeRegDate{get;set;}
}
classProgram
{
staticvoidMain()
{
Useruser=newUser{Name="Sonven",Age=35,RegDate=DateTime.Now};
//SerializeXmlSerializerserializer=newXmlSerializer(typeof(User));//Param:Type要被序列化的对象类型Streamstream=newFileStream("temp.xml",FileMode.Create);
serializer.Serialize(stream,user);
stream.Dispose();
/***********************************************
*因为RegDate应用了XmlIgnore特性,xml文件不包含
*序列化将生成XML文件类容如下,
<?xmlversion="1.0"?>
<User>
<Name>Sonven</Name>
<Age>35</Age>
</User>
*******************************************///Deserializestream=newFileStream("temp.xml",FileMode.Open,FileAccess.Read);
user=serializer.Deserialize(stream)asUser;
stream.Dispose();
if(user!=null)Console.WriteLine("DeserializeUserName:{0},Age:{1}",user.Name,user.Age);
Console.ReadKey();
}
}
}