色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    795

    瀏覽量

    41661
  • XML
    XML
    +關注

    關注

    0

    文章

    188

    瀏覽量

    33092
  • JSON
    +關注

    關注

    0

    文章

    117

    瀏覽量

    6972
收藏 人收藏

    評論

    相關推薦

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

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

    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 ?2709次閱讀
    分享一個最新的的Python<b class='flag-5'>對象</b><b class='flag-5'>序列化</b><b class='flag-5'>方式</b>

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

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

    python序列化對象

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

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

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

    ROS中的序列化實現

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

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

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

    Java序列化怎么使用

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

    什么時候需要Boost序列化

    程序開發中,序列化是經常需要用到的。像一些相對高級語言,比如JAVA, C#都已經很好的支持了序列化,那么C++呢?當然一個比較好的選擇就是用Boost,這個號稱
    的頭像 發表于 11-10 10:14 ?425次閱讀
    主站蜘蛛池模板: 老年日本老年daddy| 饱满奶大30p| 末成年美女黄网站色大片连接| 成人影片迅雷下载| 亚洲无遮挡| 乳巨揉みま痴汉电车中文字幕动漫| 久久99视频免费| 国产成人一区二区三中文| 91精品国产高清久久久久久| 亚洲精品久久久久AV无码林星阑| 人人模人人干| 美女露100%全身无遮挡| 国拍自产精品福利区| 闺蜜撬开我的腿用黄瓜折磨我| 92电影网午夜福利| 有人在线观看的视频吗免费| 亚洲zooz人禽交xxxx| 深喉吞精日本| 日本国产精品无码一区免费看| 裸妇厨房风流在线观看| 接吻吃胸摸下面啪啪教程| 国产精品爽黄69天堂A片| 成年AV动漫| sao虎影院桃红视频在线观看| 中文字幕在线播放视频| 亚洲人视频在线| 亚洲精品乱码一区二区三区| 午夜理论片日本中文在线| 色婷婷AV99XX| 色WWW永久免费视频首页| 日本妞欧洲| 日本欧美午夜三级| 日本二区三区欧美亚洲国| 欧美最猛性xxxxx亚洲精品| 嗯 用力啊 嗯 c我 啊哈老师| 麻豆成人AV久久无码精品| 久久久99精品成人片中文| 九九精品在线播放| 久久成人免费大片| 久久精品国产亚洲AV忘忧草蜜臀| 交换年轻夫妇HD中文字幕|