《项目一: 序列化》
创建一个控制台应用程序,命名为“序列化”
using System; using System.Collections.Generic; using System.Configuration; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; using System.Web.Script.Serialization; using System.Xml.Serialization; namespace 序列化 { [Serializable] public class Person : Animal { [NonSerialized] private string _name; public string Name { get{ return _name; } set { _name=value; } } public int Age { get; set; } public string Email { get; set; } public Car BenChi { get; set; } public void Say() { Console.WriteLine("OK"); } } [Serializable] public class Animal { public void Eat() { Console.WriteLine("吃东西"); } } [Serializable] public class Car //汽车 { } class Program { static void Main(string[] args) { //Json序列化 (即:把一个对象转换成一个json格式的字符串) Person p1 = new Person() { Name = "杨中科", Age = 19, Email = "123@qq.com" }; JavaScriptSerializer jss = new JavaScriptSerializer(); string jsonStr = jss.Serialize(p1); Console.WriteLine(jsonStr); //XML序列化 (即:把一个对象转换成一个XML文件的过程) XmlSerializer xml = new XmlSerializer(typeof(Person)); using (FileStream fs = new FileStream("person.xml", FileMode.OpenOrCreate)) { xml.Serialize(fs, p1); } Console.WriteLine("OK"); //二进制序列化 (即:把一个对象转换成流stream的过程,而流就是一个byte数组) //将Person对象序列化后保存到磁盘上能,就要操作磁盘文件,所以需要使用文件流(FileStream) //二进制序列化注意点: //1.被序列化对象的类型必须标记为"可序列化",即在类前面写上[Serializable] //2.被序列化的类的所有父类也必须被标记为“可序列化” [上面的json,xml序列化就不需要标记](object类是所有类的基类,object类是被标记为“可序列化”的) //3.要求被序列化的对象的类型中的所有字段的类型也必须标记为“可序列化”的 //4.如果要求被序列化的对象的类型中的某个字段(属性) 不想被序列化,那么只要在它前面添加一个[NonSerialized],就可以了。但是前提是这个属性不能为自动属性。 //二进制序列化步骤: //1.创建序列化器: BinaryFormatter bf = new BinaryFormatter(); //1.1 创建一个文件流 using (FileStream fsWrite = new FileStream("D:/wowo.txt", FileMode.OpenOrCreate)) { //2.开始执行序列化 bf.Serialize(fsWrite, p1); } Console.WriteLine("OK:二进制序列化成功"); Console.ReadKey(); } } }
《项目二:反序列化》
创建一个控制台应用程序,命名为“反序列化”,然后再添加引用,将上面的那个项目(序列化的那个控制台),引入到当前项目(反序列化的这个控制台)中来
using ConsoleApplication1; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; namespace 反序列化 { public class Program { static void Main(string[] args) { //创建序列化器 BinaryFormatter bf = new BinaryFormatter(); //二进制反序列化的时候注意: //1.必须获取被序列化的对象的类型所在的程序集(这时候就需要引入对象序列化的时候坐在的程序集),因为:反序列要根据序列化文件重新还原该对象,而序列化文件中只包含那些数据信息,并没有包含该对象的类型的其他相关信息,比如:该对象是继承自哪个父类,实现了哪些接口,类型中包含哪些方法....等等,这些信息在对象序列化文件中都不包含,要获取这些信息就必须通过该类型的程序集来获取。 //2.所以你要对二进制文件反序列化的时候,对方必须把你要反序列化的二进制文件在序列化的时候所在的程序集拷贝给你,然后你引用这个程序集(或者你在同程序集下面进行序列化和反序列化) using(FileStream fsRead=new FileStream("D:/wowo.txt",FileMode.Open)) { object obj= bf.Deserialize(fsRead); Person p1 = obj as Person; Console.WriteLine(p1.Age); Console.WriteLine(p1.Email); Console.WriteLine(p1.Name); Console.ReadKey(); } } } }
原文:http://blog.csdn.net/fanbin168/article/details/45590959