最近有一些学员问到了一些关于序列化的问题,今天这篇文章,跟大家分享一下在C#上位机开发中,常用的三种序列化的方式。
很多小伙伴一提到序列化,都会想到二进制序列化,但其实序列化并不仅仅只是二进制序列化,我们常说的对象序列化有三种方式,分别是二进制序列化、XML序列化及JSON序列化,这三种方式各有各自的优势和不足,实际应用中,大家自己根据实际情况,选择适合的。
准备在实现之前,先要做一些准备工作,序列化其实是对象和字符串(文件)之间的互相转换,所以首先我们准备好一个实体类,很简单的Student类:
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public string ClassName { get; set; }
public override string ToString()
{
return StudentId + ";" + StudentName + ";" + ClassName;
}
}
这里我重写了ToString方法,便于后续测试时,直观地看到对象的值是否正确。
同时我们准备好一个Student对象,后面就一直要对它进行操作了。
class Program
{
static void Main(string[] args)
{
Student student = new Student()
{
StudentId = 10001,
StudentName = "小华",
ClassName = "软件一班"
};
}
}
二进制
二进制序列化及反序列化的方式主要是使用BinaryFormatter这个类,序列化代码如下:
BinaryFormatter serializer = new BinaryFormatter();
MemoryStream memStream = new MemoryStream();
serializer.Serialize(memStream, student);
memStream.Close();
string info = Encoding.Unicode.GetString(memStream.ToArray());
Console.WriteLine("二进制序列化结果:");
Console.WriteLine(Environment.NewLine);
Console.WriteLine(info);
Console.WriteLine(Environment.NewLine);
反序列化代码如下:
memStream = new MemoryStream(Encoding.Unicode.GetBytes(info));
student = (Student)serializer.Deserialize(memStream);
memStream.Close();
Console.WriteLine("二进制反序列化结果:");
Console.WriteLine(Environment.NewLine);
Console.WriteLine(student.ToString());
Console.WriteLine(Environment.NewLine);
最终执行结果如下:
我们可以看到二进制序列化的结果是一串乱码,但是我们可以通过反序列化的方式,拿到转换之后的结果。
这种方式使用起来比较简单,甚至还有加密的作用,但是也有一些不足:
- 类名上面要加上[Serializable],不加无法序列化
[Serializable]
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public string ClassName { get; set; }
public override string ToString()
{
return StudentId + ";" + StudentName + ";" + ClassName;
}
}
- 序列化的结果非常大,使用System.Text.Encoding.UTF8.GetString(bytes)查看下,发现数据量很大。
- 序列化对象需要完全一致,连命名空间都要相同。
XML序列化可提高可读性,以及对象共享和使用的灵活性,XML序列化将对象的公共字段和属性或方法的参数和返回值序列化成符合特定XML格式的流。
XML序列化代码如下:
XmlWriterSettings xmlSettings = new XmlWriterSettings();
xmlSettings.OmitXmlDeclaration = true;
xmlSettings.Encoding = new System.Text.UTF8Encoding(false);
MemoryStream stream = new MemoryStream();
XmlWriter xmlwriter = XmlWriter.Create(stream, xmlSettings);
XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
xmlns.Add(String.Empty, String.Empty);
XmlSerializer ser = new XmlSerializer(typeof(Student));
ser.Serialize(xmlwriter, student, xmlns);
string info = Encoding.UTF8.GetString(stream.ToArray());
Console.WriteLine("XML序列化结果:");
Console.WriteLine(Environment.NewLine);
Console.WriteLine(info);
Console.WriteLine(Environment.NewLine);
XML反序列化代码如下:
XmlReader xmlReader = XmlReader.Create(new StringReader(info), new XmlReaderSettings());
student = (Student)new XmlSerializer(typeof(Student)).Deserialize(xmlReader);
Console.WriteLine("XML反序列化结果:");
Console.WriteLine(Environment.NewLine);
Console.WriteLine(student.ToString());
Console.WriteLine(Environment.NewLine);
最终执行结果如下:
我们可以直观地看到XML序列化的结果,可读性增强了很多,但是XML有它自身的不足之处。
JSONJSON序列化是目前使用很多的一种方式,实现JSON序列化的方式也有很多,我一般会使用NewSoft.Json这个库来做,可以通过Nuget搜索安装。
JSON序列化代码如下:
string info = JsonConvert.SerializeObject(student);
Console.WriteLine("JSON序列化结果:" + Environment.NewLine);
Console.WriteLine(info);
Console.WriteLine(Environment.NewLine);
JSON反序列化代码如下:
student = (Student)JsonConvert.DeserializeObject(info, typeof(Student));
Console.WriteLine("JSON反序列化结果:");
Console.WriteLine(Environment.NewLine);
Console.WriteLine(student.ToString());
Console.WriteLine(Environment.NewLine);
最终执行结果如下:
我们可以看到JSON的方式除了可读性增强之外,结果也更加简洁。
不管是上位机开发,还是纯软件开发,C#序列化的这几种方式都要牢记。
-END-
我是新阁上位机开发老师,用我的专业,成就你的梦想!