C#序列化与反序列化
发布日期:2021-05-10 09:24:50 浏览次数:18 分类:精选文章

本文共 6127 字,大约阅读时间需要 20 分钟。

C# 序列化技术概述

1. 序列化简介

序列化是将内存中的对象信息转化为持久化存储形式,主要用于数据的保存、传输或跨平台通信。常见的序列化格式包括 JSON、XML、文件等。以下将重点讲解 C# 中的 JSON 和 XML 序列化,以及将其结果保存到文件中的实现方法。


1.1 JSON 序列化

在 C# 中,DataContractJsonSerializer 是用于将对象序列化为 JSON 格式的原生类。这使得开发者能够方便地将 C# 对象与 JSON 格式进行交互。下面是详细的实现步骤:

实现步骤

  • 准备数据类

    定义一个具有 [DataContract] 属性的类,并使用 [DataMember] 标记标注需要序列化的属性:

    [DataContract]public class Book{    [DataMember]    public int ID { get; set; }    [DataMember]    public string Name { get; set; }    [DataMember]    public float Price { get; set; }}
  • 引入必要的命名空间

    为了使用 DataContractJsonSerializer,需要引用以下命名空间:

    • System.ServiceModel
    • System.ServiceModel.Web
    • System.Runtime.Serialization
  • 序列化为 JSON 字符串

    使用 DataContractJsonSerializer 实例的 WriteObject() 方法将对象序列化为 JSON 字符串:

    class Program{    static void Main(string[] args)    {        Book book = new Book { ID = 101, Name = "C#程序设计", Price = 79.5f };        DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(Book));        using (MemoryStream stream = new MemoryStream())        {            formatter.WriteObject(stream, book);            string result = Encoding.UTF8.GetString(stream.ToArray());            Console.WriteLine(result);        }    }}
  • 新增 JSON 序列化方法

    进一步提供一个通用的 ObjectToJson 方法,可用于任何有 [DataContract] 标注的类:

    public static class Serializer{    public static string ObjectToJson
    (T obj) where T : class { DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T)); using (MemoryStream stream = new MemoryStream()) { formatter.WriteObject(stream, obj); return Encoding.UTF8.GetString(stream.ToArray()); } }}
  • 5. **反序列化 JSON 为对象**     使用 `ReadObject()` 方法将 JSON 字符串反序列化为对象:   ```csharp   public static class Serializer   {       public static T JsonToObject
    (string json) where T : class { DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T)); using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) { return formatter.ReadObject(stream) as T; } } }

    1.2 XML 序列化

    C# 中使用 XmlSerializer 类来实现 XML 格式的序列化和反序列化操作。以下是实现步骤:

    实现步骤

  • 引入命名空间

    需要引入以下命名空间:

    • System.Xml.Serialization
  • 序列化为 XML 字符串或文件

    使用 XmlSerializer 实例的 Serialize() 方法将对象序列化为 XML 格式:

    class Program{    static void Main(string[] args)    {        Book book = new Book { ID = 101, Name = "C#程序设计", Price = 79.5f };        XmlSerializer formatter = new XmlSerializer(typeof(Book));        using (MemoryStream stream = new MemoryStream())        {            formatter.Serialize(stream, book);            string result = Encoding.UTF8.GetString(stream.ToArray());            Console.WriteLine(result);        }    }}
  • 反序列化 XML 为对象

    使用 Deserialize() 方法将 XML 字符串或文件反序列化为对象:

    class Program{    static void Main(string[] args)    {        Book book = new Book { ID = 101, Name = "C#程序设计", Price = 79.5f };        XmlSerializer formatter = new XmlSerializer(typeof(Book));        using (FileStream stream = new FileStream(@"c:\book.xml", FileMode.OpenOrCreate))        {            XmlReader reader = new XmlTextReader(stream);            Book outBook = formatter.Deserialize(reader) as Book;            Console.WriteLine(outBook.ID);            Console.WriteLine(outBook.Name);            Console.WriteLine(outBook.Price);        }    }}
  • 新增 XML 序列化方法

    提供通用的 ObjectToXmlXmlToObject 方法:

    public static class Serializer{    public static bool ObjectToXml
    (T obj, string path) where T : class { XmlSerializer formatter = new XmlSerializer(typeof(T)); using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate)) { formatter.Serialize(stream, obj); return true; } } public static T XmlToObject
    (string path) where T : class { XmlSerializer formatter = new XmlSerializer(typeof(T)); using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate)) { XmlReader reader = new XmlTextReader(stream); return formatter.Deserialize(reader) as T; } }}
  • ---## 1.3 保存序列化结果为文件为了方便数据的存储和传输,可以将序列化后的结果保存为二进制文件。C# 提供了 `BinaryFormatter` 类来实现此功能。### 实现步骤1. **引入命名空间**     需要引入以下命名空间:   - `System.Runtime.Serialization.Formatters.Binary`2. **将对象序列化为文件**     使用 `BinaryFormatter` 实例的 `Serialize()` 方法:   ```csharp   class Program   {       static void Main(string[] args)       {           Book book = new Book { ID = 101, Name = "C#程序设计", Price = 79.5f };           BinaryFormatter formatter = new BinaryFormatter();           using (FileStream stream = new FileStream(@"c:\book.txt", FileMode.OpenOrCreate))           {               formatter.Serialize(stream, book);           }       }   }
    1. 反序列化文件为对象

      使用 Deserialize() 方法读取二进制文件并反序列化为对象:

      class Program{    static void Main(string[] args)    {        Book book = new Book { ID = 101, Name = "C#程序设计", Price = 79.5f };        BinaryFormatter formatter = new BinaryFormatter();        using (FileNotFoundException fe = new FileNotFoundException("无法打开文件", @"c:\book.txt"))        {            using (FileStream stream = fe.FileStream)            {                Book outBook = formatter.Deserialize(stream) as Book;                Console.WriteLine(outBook.ID);                Console.WriteLine(outBook.Name);                Console.WriteLine(outBook.Price);            }        }    }}
    2. 新增文件序列化方法

      提供通用的 ObjectToFileFileToObject 方法:

      public static class Serializer{    public static bool ObjectToFile
      (T obj, string path) where T : class { BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate)) { formatter.Serialize(stream, obj); return true; } } public static T FileToObject
      (string path) where T : class { BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(path, FileMode.Open)) { return formatter.Deserialize(stream) as T; } }}
    3. ---## 结论通过上述步骤,可以在 C# 中将对象序列化为 JSON、XML、或二进制文件,并反序列化回来。每种方法都有其优缺点,具体选择取决于需求场景。
    上一篇:C#中使用Newtonsoft.Json(Json.NET)的创建Json文件和解析
    下一篇:C#位运算基本概念与计算过程

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年05月01日 16时25分21秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    C语言程序设计梁海英答案,1.5 习题 2023-01-24
    c语言编写单片机中断,C语言AVR单片机中断程序写法 2023-01-24
    #pragma region、{} 2023-01-24
    ddr2的上电顺序_S5PV210 DDR2初始化 28个步骤总结 2023-01-24
    deque stack java_「集合系列」- 初探 java 集合框架图 2023-01-24
    easyexcel 导出 代码翻译converter_【starter推荐】简单高效Excel 导出工具 2023-01-24
    echarts 如何在一条柱形显示两个数字_干货 | 如何快速制作数据地图?让你的可视化逼格再高一级!... 2023-01-24
    eclipse设置utf8编码_记住没:永远不要在 MySQL 中使用 UTF8 2023-01-24
    eclipse里source的快捷方法_Eclipse快捷键/快捷操作汇总 2023-01-24
    elasticsearch 查询_Elasticsearch地理信息存储及查询之Geo_Point 2023-01-24
    embedding层_【预估排序】Embedding+MLP: 深度学习预估排序通用框架(一) 2023-01-24
    excel中最常用的30个函数_Excel玩转数据分析常用的43个函数! 2023-01-24
    flink sql设置并行度_Flink 参数配置和常见参数调优 2023-01-24
    go 字符串替换_Go 每日一库之 quicktemplate 2023-01-24
    hex editor neo下载_口袋妖怪爆焰黑手机版下载-口袋妖怪爆焰黑手游下载v4.3.0 安卓版... 2023-01-24
    hibernate mysql 关联查询_spring-boot hibernate 双向关联查询的坑 2023-01-24
    hive 建表_sqoop的使用之导入到hive和mysql 2023-01-24
    hp工作站z8装Linux,惠普Z8G4双路最小工作站 2023-01-24
    html上传图片直接保存到数据库中,Editor上传图片路径存入数据库中怎么弄? 2023-01-24
    html游戏玩不了,WinXP网页游戏玩不了怎么办有哪些解决方法 2023-01-24