新閣上位機開發---C#實現對象序列化的三種方式

前言

最近有一些學員問到了一些關於序列化的問題,今天這篇文章,跟大家分享一下在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格式的流。

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有它自身的不足之處。

JSON

JSON序列化是目前使用很多的一種方式,實現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-

我是新閣上位機開發老師,用我的專業,成就你的夢想!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章