0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C#實現(xiàn)對象序列化的三種方式是什么

汽車電子技術(shù) ? 來源: dotNet工控上位機 ? 作者:新閣教育付工 ? 2023-02-22 16:11 ? 次閱讀

Begin-

前言

最近有一些學(xué)員問到了一些關(guān)于序列化的問題,今天這篇文章,跟大家分享一下在C#開發(fā)中,常用的三種序列化的方式。

很多小伙伴一提到序列化,都會想到二進(jìn)制序列化,但其實序列化并不僅僅只是二進(jìn)制序列化,我們常說的對象序列化有三種方式,分別是二進(jìn)制序列化、XML序列化及JSON序列化,這三種方式各有各自的優(yōu)勢和不足,實際應(yīng)用中,大家自己根據(jù)實際情況,選擇適合的。

準(zhǔn)備

在實現(xiàn)之前,先要做一些準(zhǔn)備工作,序列化其實是對象和字符串(文件)之間的互相轉(zhuǎn)換,所以首先我們準(zhǔn)備好一個實體類,很簡單的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方法,便于后續(xù)測試時,直觀地看到對象的值是否正確。

同時我們準(zhǔn)備好一個Student對象,后面就一直要對它進(jìn)行操作了。

class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student()
            {
                StudentId = 10001,
                StudentName = "小華",
                ClassName = "軟件一班"
            };
        } 
    }

二進(jìn)制

二進(jìn)制序列化及反序列化的方式主要是使用BinaryFormatter這個類,序列化代碼如下:

BinaryFormatter serializer = new BinaryFormatter();

    MemoryStream memStream = new MemoryStream();

    serializer.Serialize(memStream, student);

    memStream.Close();

    string info = Encoding.Unicode.GetString(memStream.ToArray());

    Console.WriteLine("二進(jìn)制序列化結(jié)果:");

    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("二進(jìn)制反序列化結(jié)果:");

    Console.WriteLine(Environment.NewLine);

    Console.WriteLine(student.ToString());

    Console.WriteLine(Environment.NewLine);

最終執(zhí)行結(jié)果如下:

圖片

我們可以看到二進(jìn)制序列化的結(jié)果是一串亂碼,但是我們可以通過反序列化的方式,拿到轉(zhuǎn)換之后的結(jié)果。

這種方式使用起來比較簡單,甚至還有加密的作用,但是也有一些不足:

  • 類名上面要加上[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;
        }
    }
  • 序列化的結(jié)果非常大,使用System.Text.Encoding.UTF8.GetString(bytes)查看下,發(fā)現(xiàn)數(shù)據(jù)量很大。
  • 序列化對象需要完全一致,連命名空間都要相同。

XML

XML序列化可提高可讀性,以及對象共享和使用的靈活性,XML序列化將對象的公共字段和屬性或方法的參數(shù)和返回值序列化成符合特定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序列化結(jié)果:");
    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反序列化結(jié)果:");
    Console.WriteLine(Environment.NewLine);
    Console.WriteLine(student.ToString());
    Console.WriteLine(Environment.NewLine);

最終執(zhí)行結(jié)果如下:

圖片

我們可以直觀地看到XML序列化的結(jié)果,可讀性增強了很多,但是XML有它自身的不足之處。

JSON

JSON序列化是目前使用很多的一種方式,實現(xiàn)JSON序列化的方式也有很多,我一般會使用NewSoft.Json這個庫來做,可以通過Nuget搜索安裝。

JSON序列化代碼如下:

string info = JsonConvert.SerializeObject(student);
    Console.WriteLine("JSON序列化結(jié)果:" + Environment.NewLine);
    Console.WriteLine(info);
    Console.WriteLine(Environment.NewLine);

JSON反序列化代碼如下:

student = (Student)JsonConvert.DeserializeObject(info, typeof(Student));
    Console.WriteLine("JSON反序列化結(jié)果:");
    Console.WriteLine(Environment.NewLine);
    Console.WriteLine(student.ToString());
    Console.WriteLine(Environment.NewLine);

最終執(zhí)行結(jié)果如下:

圖片

我們可以看到JSON的方式除了可讀性增強之外,結(jié)果也更加簡潔。

-END-

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    772

    瀏覽量

    41536
  • XML
    XML
    +關(guān)注

    關(guān)注

    0

    文章

    186

    瀏覽量

    33014
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    114

    瀏覽量

    6921
收藏 人收藏

    評論

    相關(guān)推薦

    如何使用Serde進(jìn)行序列化和反序列化

    Serde 是一個用于序列化和反序列化 Rust 數(shù)據(jù)結(jié)構(gòu)的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化和反序列化方式
    的頭像 發(fā)表于 09-30 17:09 ?1218次閱讀

    Java序列化的機制和原理

    。SerialTest類實現(xiàn)了Parent超類,內(nèi)部還持有一個Container對象。序列化后的格式如下:AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C
    發(fā)表于 07-10 07:27

    c語言序列化和反序列化有何區(qū)別

    這里寫自定義目錄標(biāo)題c語言序列化和反序列化tplut.htplut.c測試代碼參考c語言序列化
    發(fā)表于 07-14 07:32

    關(guān)于c語言序列化和反序列化的知識點看完你就懂了

    關(guān)于c語言序列和反序列化的知識點你就懂了
    發(fā)表于 10-15 08:47

    SpringMVC JSON框架的自定義序列化與反序列化

    限于createTime和updateTime,更貼近于需求缺點就是需要轉(zhuǎn)換的字段都需要使用注解,工作量有點大當(dāng)然有其他的統(tǒng)一處理方案,這里不贅述。自定義反序列化在jackson框架上實現(xiàn)自定義序列化
    發(fā)表于 10-10 16:02

    java序列化和反序列化范例和JDK類庫中的序列化API

    一、序列化和反序列化的概念 把對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象序列化。 把字節(jié)
    發(fā)表于 09-27 10:13 ?6次下載

    java序列化的幾種方式

    一.Java序列化的作用 有的時候我們想要把一個Java對象變成字節(jié)流的形式傳出去,有的時候我們想要從一個字節(jié)流中恢復(fù)一個Java對象。例如,有的時候我們想要 把一個Java對象寫入到
    發(fā)表于 09-27 11:15 ?0次下載

    分享一個最新的的Python對象序列化方式

    應(yīng)該都見過這個: 雖然這不是什么大問題。json模塊(API繼承自simplejson)提供了兩方式序列化對象: 1. 實現(xiàn)一個defa
    的頭像 發(fā)表于 09-01 15:19 ?2656次閱讀
    分享一個最新的的Python<b class='flag-5'>對象</b><b class='flag-5'>序列化</b><b class='flag-5'>方式</b>

    static屬性為什么不會被序列化

    實現(xiàn)序列化和反序列化為什么要實現(xiàn)Serializable接口?
    的頭像 發(fā)表于 07-15 11:03 ?1702次閱讀

    python序列化對象

    序列化對象:將對象轉(zhuǎn)換為可以存儲或傳輸?shù)男问健? (1) 用于存儲:將對象的字節(jié)序列存儲到文件中,程序退出后不會消失,便于后續(xù)使用。
    的頭像 發(fā)表于 03-10 09:57 ?2296次閱讀

    什么是序列化 為什么要序列化

    什么是序列化? “序列化”(Serialization )的意思是將一個對象轉(zhuǎn)化為字節(jié)流。 這里說的對象可以理解為“面向對象”里的那個
    的頭像 發(fā)表于 09-14 17:22 ?2384次閱讀
    什么是<b class='flag-5'>序列化</b> 為什么要<b class='flag-5'>序列化</b>

    ROS中的序列化實現(xiàn)

    理解了序列化,再回到ROS。我們發(fā)現(xiàn),ROS沒有采用第方的序列化工具,而是選擇自己實現(xiàn),代碼在roscpp_core項目下的roscpp_serialization中,見下圖。這個功
    的頭像 發(fā)表于 09-14 17:26 ?848次閱讀

    如何用C語言進(jìn)行json的序列化和反序列化

    json是目前最為流行的文本數(shù)據(jù)傳輸格式,特別是在網(wǎng)絡(luò)通信上廣泛應(yīng)用,隨著物聯(lián)網(wǎng)的興起,在嵌入式設(shè)備上,也需要開始使用json進(jìn)行數(shù)據(jù)傳輸,那么,如何快速簡潔地用C語言進(jìn)行json的序列化和反序列化
    的頭像 發(fā)表于 10-07 11:05 ?1323次閱讀

    Java序列化怎么使用

    轉(zhuǎn)換方式就叫做序列化。將文件或者網(wǎng)絡(luò)傳輸中得到的 byte[] 數(shù)組轉(zhuǎn)換為 java 對象就叫做反序列化。 怎么使用 如果一個 Java 對象
    的頭像 發(fā)表于 10-10 14:19 ?394次閱讀

    什么時候需要Boost序列化

    程序開發(fā)中,序列化是經(jīng)常需要用到的。像一些相對高級語言,比如JAVA, C#都已經(jīng)很好的支持了序列化,那么C++呢?當(dāng)然一個比較好的選擇就是用Boost,這個號稱
    的頭像 發(fā)表于 11-10 10:14 ?377次閱讀