C#面:简单介绍 序列化 和 反序列化

序列化:

是将对象转换为可保持或可传输的形式的过程。

.NET 具有以下序列化技术:

  • 二进制序列化保持类型保真,这对于多次调用应用程序时保持对象状态非常有用。 例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。 您可以将对象序列化到流、磁盘、内存和网络等。 远程处理使用序列化,"按值"在计算机或应用程序域之间传递对象。
  • XML 和 SOAP 序列化只序列化公共属性和字段,并且不保持类型保真。 当您希望提供或使用数据而不限制使用该数据的应用程序时,这一点非常有用。 由于 XML 是开放式的标准,因此它对于通过 Web 共享数据来说是一个理想选择。 SOAP 同样是开放式的标准,这使它也成为一个理想选择。
  • JSON 序列化只序列化公共属性,并且不保持类型保真。 JSON 是开放式的标准,对于通过 Web 共享数据来说是一个理想选择。

用到的类:

System.Runtime.Serialization

包含可用于序列化和反序列化对象的类。

System.Xml.Serialization

包含可用于将对象序列化为 XML 格式的文档或流的类。

System.Text.Json

包含可用于将对象序列化为 JSON 格式的文档或流的类。

反序列化:

是将流转换为对象的过程。

这两个过程一起保证能够存储和传输数据。

注意:

  1. 如果一个类可以序列化,它的子类和包含的各成员对象不一定都可以序列化。如果一个类可以序列化,但其子类或包含的成员对象不满足序列化条件,那么在序列化过程中可能会抛出异常。因此,在设计可序列化的类继承结构时,需要确保所有相关的类都满足序列化条件。
  2. 若要忽略单个属性,请使用 JsonIgnore 特性。

示例:

JSON序列化示例:

cs 复制代码
public class Person
{
    public string? Name { get; set; }
    public int Age { get; set; }
    public DateTimeOffset Date { get; set; }
}
internal class Program
{
    static void Main(string[] args)
    {
        //创建一个Person类的对象
        Person person = new Person
        {
            Name = "大毛",
            Age = 10,
            Date = DateTime.Now
        };
        //序列化为JSON
        string jsonString = JsonSerializer.Serialize(person);
        Console.WriteLine(jsonString);
        //{"Name":"\u5927\u6BDB","Age":10,"Date":"2024-03-03T17:01:29.4062255+08:00"}

    }
}

JSON反序列化示例:

cs 复制代码
public class Person
{
    public string? Name { get; set; }
    public int Age { get; set; }
    public DateTimeOffset Date { get; set; }
}
internal class Program
{
    static void Main(string[] args)
    {
        string jsonString = @"{""Name"":""\u5927\u6BDB"",""Age"":10,""Date"":""2024-03-03T17:01:29.4062255+08:00""}";
        Person? person = JsonSerializer.Deserialize<Person?>(jsonString);

        Console.WriteLine($"姓名:{person?.Name}");
        Console.WriteLine($"年龄:{person?.Age}");
        Console.WriteLine($"创建时间:{person?.Date}");
    //姓名: 大毛
    //年龄:10
    //创建时间:2024 - 03 - 03 17:01:29 + 08:00
相关推荐
2603_965148115 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
波波0075 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
知无不研7 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
cfm_29148 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
wujian83119 小时前
怎么用千问生成word文档:从「格式崩」到「一键过」,AI导出鸭打通最后半厘米
人工智能·ai·c#·word·豆包·deepseek·ai导出鸭
C++ 老炮儿的技术栈9 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011169 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据9 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡10 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai10 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库