C#序列化与反序列化的实例详解

发布时间:2019-10-06编辑:脚本学堂
本文通过具体的例子,为大家深入讲解,c#序列化与反序死的相关内容,相信通过本文的学习,你对C#序列化与反序化的内容,应该有一个全新而深入的认识。希望本文可以帮助到您。

如下:
 

复制代码 代码示例:
﹤?xml version="1.0"?﹥
﹤Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"﹥
﹤Sex﹥男﹤/Sex﹥
﹤Age﹥31﹤/Age﹥
﹤Courses﹥
﹤Course﹥
﹤Name﹥英语﹤/Name﹥
﹤Description﹥交流工具﹤/Description﹥
﹤/Course﹥
﹤Course﹥
﹤Name﹥数学﹤/Name﹥
﹤Description﹥自然科学﹤/Description﹥
﹤/Course﹥
﹤/Courses﹥
﹤Name﹥cyj﹤/Name﹥
﹤/Person﹥

4,自定义序列化
如果希望让用户对类进行串行化,但是对数据流的组织方式不完全满意,那么可以通过在自定义类中实现接口来自定义串行化行为。这个接口只有一个方法,GetObjectData. 这个方法用于将对类对象进行串行化所需要的数据填进SerializationInfo对象。你使用的格式化器将构造SerializationInfo对象,然后在串行化时调用GetObjectData. 如果类的父类也实现了ISerializable,那么应该调用GetObjectData的父类实现。如果你实现了ISerializable,那么还必须提供一个具有特定原型的构造器,这个构造器的参数列表必须与GetObjectData相同。这个构造器应该被声明为私有的或受保护的,以防止粗心的开发人员直接使用它。

实现ISerializable的类:
 

复制代码 代码示例:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
/**//// ﹤summary﹥
/// Employee 的摘要说明
/// ﹤/summary﹥
[Serializable]
public class Employee:ISerializable
{
public int EmpId=100;
public string EmpName="刘德华";
[NonSerialized]
public string NoSerialString = "NoSerialString-Test";
public Employee()
{
//
<SPAN style="WHITE-SPACE: pre"> </SPAN>// TODO: 在此处添加构造函数逻辑
<SPAN style="WHITE-SPACE: pre"> </SPAN>//
}
private Employee(SerializationInfo info, StreamingContext ctxt)
{
<SPAN style="WHITE-SPACE: pre"> </SPAN>EmpId = (int)info.GetValue("EmployeeId", typeof(int));
<SPAN style="WHITE-SPACE: pre"> </SPAN>EmpName = (String)info.GetValue("EmployeeName",typeof(string));
<SPAN style="WHITE-SPACE: pre"> </SPAN>//NoSerialString = (String)info.GetValue("EmployeeString",typeof(string));
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
<SPAN style="WHITE-SPACE: pre"> </SPAN>info.AddValue("EmployeeId", EmpId);
<SPAN style="WHITE-SPACE: pre"> </SPAN>info.AddValue("EmployeeName", EmpName);
<SPAN style="WHITE-SPACE: pre"> </SPAN>//info.AddValue("EmployeeString", NoSerialString);
}
}

C#序列化和反序列化方法:
 

复制代码 代码示例:
public void OtherEmployeeClassTest()
{
Employee mp = new Employee();
mp.EmpId = 10;
mp.EmpName = "邱枫";
mp.NoSerialString = "你好呀";
Stream steam = File.Open("c:temp3.dat", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
Response.Write("Writing Employee Info:");
bf.Serialize(steam,mp);
steam.Close();
mp = null;
//C#序列化和反序列化之反序列化
Stream steam2 = File.Open("c:temp3.dat", FileMode.Open);
BinaryFormatter bf2 = new BinaryFormatter();
Response.Write("Reading Employee Info:");
Employee mp2 = (Employee)bf2.Deserialize(steam2);
steam2.Close();
Response.Write(mp2.EmpId);
Response.Write(mp2.EmpName);
Response.Write(mp2.NoSerialString);
}

有关C#序列化和反序列化的内容就介绍这些了,有兴趣的朋友,可以动手测试下本文所有的示例,相信你一定会有很多收获的。