.net 中序列化和反序列化的使用
序列化的目的:将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
序列化
序列化分为JSON 序列化,XML序列化,二进制序列化
准备工作,新建一个Person类
1 [Serializable] 2 public class Person 3 { 4 public string Name { get; set; } 5 public int Age { get; set; } 6 }
该类用[Serializable]标签表示为可序列化
准备工作,创建该类的示例
1 Person p = new Person() { Name = "张三", Age = 25 };
一,JSON序列化和反序列化
1,JSON序列化
1 /*json序列化*/ 2 var javaScriptSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 3 var str = javaScriptSerializer.Serialize(p);
结果:
2,JSON反序列化
1 /*json 反序列化*/ 2 var jsonObject = javaScriptSerializer.Deserialize(str, p.GetType()); 3 Console.WriteLine((jsonObject as Person).Name); 4 Console.Read();
3,JSON序列化还有一种方式
1 /*json序列化*/ 2 DataContractJsonSerializer dcjs = new DataContractJsonSerializer(p.GetType()); 3 MemoryStream ms = new MemoryStream(); 4 dcjs.WriteObject(ms, p); 5 var s = Encoding.UTF8.GetString(ms.ToArray()); 6 ms.Close(); 7 /*反序列化*/ 8 MemoryStream ms1 = new MemoryStream(Encoding.UTF8.GetBytes(s)); 9 var objPerson = dcjs.ReadObject(ms1) as Person;
使用这个类的时候,会在序列化的JSON字符串带有 K__BackingFideId 前缀
如下图;
当Person 类中没有[Serializable] 标签的时候一切都恢复正常了
二,XML序列化和反序列化
1 /*xml序列化*/ 2 FileStream fsXml = new FileStream("1.xml", FileMode.Create, FileAccess.ReadWrite); 3 System.Xml.Serialization.XmlSerializer xsl = new XmlSerializer(p.GetType()); 4 xsl.Serialize(fsXml, p); 5 fsXml.Dispose(); 6 7 /*xml反序列化*/ 8 FileStream fsDeXml = new FileStream("1.xml", FileMode.Open, FileAccess.ReadWrite); 9 var Xmlobj = xsl.Deserialize(fsDeXml); 10 fsDeXml.Dispose();
三,二进制序列化和反序列化
1 /*二进制序列化*/ 2 FileStream fsBin = new FileStream("2.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); 3 BinaryFormatter bf = new BinaryFormatter(); 4 bf.Serialize(fsBin, p); 5 fsBin.Dispose(); 6 7 /*二进制反序列化*/ 8 FileStream fsBinDes = new FileStream("2.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); 9 BinaryFormatter bfDes = new BinaryFormatter(); 10 var binObject = bfDes.Deserialize(fsBinDes);
将不朽的青春献给伟大的编程事业,世界将因我们而改变!