开发者应当熟知的 C# 序列化和反序列化( 二 )

输出结果如下:

开发者应当熟知的 C# 序列化和反序列化

文章插图
  • JavaScriptSerializer
我们利用前面定义的类,来看一下 JavaScriptSerializer 的使用方法,我们将前面定义的类中的 DataContract 和 DataMember 都去掉 。我们如果要使用 JavaScriptSerializer 只需引入 System.Web.Script.Serialization 命名空间即可 。代码如下:
using System.Web.Script.Serialization;下面我们就利用 JavaScriptSerializer 对象进行序列化和反序列化,代码如下:
class Program{static void Main(string[] args){#region 序列化Student student = new Student{Name = "Tom",Age = 20,Sex = 1,Address = new Address{City = "NYC",Road = "ABC"}};//初始化JavaScriptSerializer serializer = new JavaScriptSerializer;string jsonStr = serializer.Serialize(student);Console.WriteLine(jsonStr);#endregion#region 反序列化student = serializer.Deserialize<Student>(jsonStr);Console.WriteLine("Name: " +student.Name);Console.WriteLine("Sex: " + student.Sex);Console.WriteLine("Age: " + student.Age);Console.WriteLine("Address: " + student.Address.City+" "+student.Address.Road);#endregionConsole.ReadLine;}}从上面的代码我们可以看出利用 JavaScriptSerializer 序列化和反序列化要比 DataContractJsonSerializer 类方便 。上述代码运行结果如下:
开发者应当熟知的 C# 序列化和反序列化

文章插图
  • Newtonsoft.Json
Newtonsoft.Json 功能有很多,除了序列化反序列化之外,还有 Linq To Json、Json Path、 XML support等,我们这篇文章我们只讲解其中的序列化和反序列化 。使用 Newtonsoft.Json 前首先我们需要在 nuget 中搜索并安装,安装完成后引入 Newtonsoft.Json,代码如下:
using Newtonsoft.Json;下面我们来看看 Newtonsoft.Json 的具体使用:
class Program{static void Main(string[] args){#region 序列化Student student = new Student{Name = "Tom",Age = 20,Sex = 1,Address = new Address{City = "NYC",Road = "ABC"}};string jsonStr = JsonConvert.SerializeObject(student);Console.WriteLine(jsonStr);#endregion#region 反序列化student = JsonConvert.DeserializeObject<Student>(jsonStr);Console.WriteLine("Name: " +student.Name);Console.WriteLine("Sex: " + student.Sex);Console.WriteLine("Age: " + student.Age);Console.WriteLine("Address: " + student.Address.City+" "+student.Address.Road);#endregionConsole.ReadLine;}}上述代码输出结果如下:
开发者应当熟知的 C# 序列化和反序列化

文章插图
从代码中我们看到 Newtonsoft.Json 序列化和反序列化更加简单,简单到只需要一行代码就完成了序列化和反序列化 。
2. XML
在 JSON 还没出现之前,XML 是互联网上常用的数据交换格式和规范 。.NET 中提供 XmlSerializer 类将对象序列化为 XML 和将 XML 反序列化为对象,使用方法是首先实例化,然后调用序列化/反序列化方法 。下面我们依然使用最开始定义的那个类,来看看 XmlSerializer 的使用 。使用前我们需要引入 using System.Xml.Serialization 命名空间 。
using System.Xml.Serialization;具体序列化/反序列化方法如下:
class Program{static void Main(string[] args){#region 序列化Student student = new Student{Name = "Tom",Age = 20,Sex = 1,Address = new Address{City = "NYC",Road = "ABC"}};XmlSerializer xmlSerializer = new XmlSerializer(typeof(Student));using (FileStream stream = new FileStream(@"d:123.xml", FileMode.OpenOrCreate)){xmlSerializer.Serialize(stream, student);}#endregion#region 反序列化using (FileStream stream = new FileStream(@"d:123.xml", FileMode.OpenOrCreate)){XmlReader xmlReader = new XmlTextReader(stream);student = xmlSerializer.Deserialize(xmlReader) as Student;}Console.WriteLine("Name: " + student.Name);Console.WriteLine("Sex: " + student.Sex);Console.WriteLine("Age: " + student.Age);Console.WriteLine("Address: " + student.Address.City + " " + student.Address.Road);#endregionConsole.ReadLine;}}这里有一点需要注意,如果对象类的访问修饰符不是 public 将会报错 。上述代码运行结果如下:
开发者应当熟知的 C# 序列化和反序列化

文章插图

开发者应当熟知的 C# 序列化和反序列化

文章插图
3. 二进制
序列化为二进制,在实际开发中真的很少用到,但是我觉得还是有必要讲一讲,它的使用方法和 XmlSerializer 序列化/反序列化类似,首先实例化,然后调用序列化/反序列化方法 。在进行序列化/反序列化前首先引入命名空间 System.Runtime.Serialization.Formatters.Binary,同时修改对象类如下:


推荐阅读