在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C#實現對象序列化的三種方式是什么

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

Begin-

前言

最近有一些學員問到了一些關于序列化的問題,今天這篇文章,跟大家分享一下在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的方式除了可讀性增強之外,結果也更加簡潔。

-END-

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二進制
    +關注

    關注

    2

    文章

    803

    瀏覽量

    42016
  • XML
    XML
    +關注

    關注

    0

    文章

    188

    瀏覽量

    33434
  • JSON
    +關注

    關注

    0

    文章

    119

    瀏覽量

    7191
收藏 人收藏

    評論

    相關推薦

    如何使用Serde進行序列化和反序列化

    Serde 是一個用于序列化和反序列化 Rust 數據結構的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化和反序列化方式
    的頭像 發表于 09-30 17:09 ?1543次閱讀

    Java序列化的機制和原理

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

    c語言序列化和反序列化有何區別

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

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

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

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

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

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

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

    java序列化的幾種方式

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

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

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

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

    實現序列化和反序列化為什么要實現Serializable接口?
    的頭像 發表于 07-15 11:03 ?1919次閱讀

    python序列化對象

    序列化對象:將對象轉換為可以存儲或傳輸的形式。 (1) 用于存儲:將對象的字節序列存儲到文件中,程序退出后不會消失,便于后續使用。
    的頭像 發表于 03-10 09:57 ?2426次閱讀

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

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

    ROS中的序列化實現

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

    如何用C語言進行json的序列化和反序列化

    json是目前最為流行的文本數據傳輸格式,特別是在網絡通信上廣泛應用,隨著物聯網的興起,在嵌入式設備上,也需要開始使用json進行數據傳輸,那么,如何快速簡潔地用C語言進行json的序列化和反序列化
    的頭像 發表于 10-07 11:05 ?1769次閱讀

    Java序列化怎么使用

    轉換方式就叫做序列化。將文件或者網絡傳輸中得到的 byte[] 數組轉換為 java 對象就叫做反序列化。 怎么使用 如果一個 Java 對象
    的頭像 發表于 10-10 14:19 ?555次閱讀

    什么時候需要Boost序列化

    程序開發中,序列化是經常需要用到的。像一些相對高級語言,比如JAVA, C#都已經很好的支持了序列化,那么C++呢?當然一個比較好的選擇就是用Boost,這個號稱
    的頭像 發表于 11-10 10:14 ?539次閱讀
    主站蜘蛛池模板: 国内夫妇交换性经过实录 | 性中国videosex国产孕妇 | 亚洲一卡2卡4卡5卡6卡在线99 | 天天爽夜夜爽天天做夜夜做 | 五月天婷婷伊人 | 久久精品亚瑟全部免费观看 | 免费的黄色片 | 成人在线免费电影 | 国产一级一级片 | 久久精品亚洲热综合一本奇米 | 国产亚洲精品仙踪林在线播放 | 婷婷97狠狠的狠狠的爱 | 一级黄色大全 | 国产亚洲精品aaa大片 | 成人欧美另类人妖 | 四虎最新紧急入口4hu | 永久黄色免费网站 | 国产一区二区三区美女在线观看 | 天堂网av2014| 天天视频官网天天视频在线 | 91日韩精品天海翼在线观看 | 国产午夜免费一区二区三区 | 美女下面小内内的沟 | 亚洲国产成人精品女人久久久 | 亚洲伦理中文字幕一区 | 午夜爱爱爱爱爽爽爽网站免费 | 免费网站黄| 韩国免费特一级毛片 | 天天摸天天碰成人免费视频 | 国产福利不卡一区二区三区 | 在线黄网 | 色播图片 | 久久综合亚洲 | 国产午夜精品理论片免费观看 | 一级毛片aaaaaa免费看 | 日本三级强在线观看 | 成人黄色免费看 | 日本不卡视频在线播放 | 一级特黄色毛片免费看 | 婷婷六月综合 | 亚洲视频三区 |