C#基础-序列化和反序列化

在C#中,序列化和反序列化是数据转换的两种基本形式,它们在对象与可以存储或传输的格式(如二进制、XML、JSON等)之间转换数据。序列化是将对象状态转换为可以保存或传输的格式的过程,而反序列化则是将已保存的或传输的数据重新构造回对象的过程。

序列化

序列化主要用于以下场景:

  • 对象的持久化,将对象保存到磁盘或数据库中。
  • 对象的状态在网络上传输。
  • 深度复制对象。

C# 提供了多种序列化机制,包括二进制序列化、XML序列化和JSON序列化。

1. 二进制序列化

二进制序列化使用 BinaryFormatter 类,适用于.NET环境内部的对象状态保存与恢复。但请注意,二进制序列化并不保证跨版本或跨平台的兼容性。

csharp 复制代码
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable]
public class MyData
{
    public int Value { get; set; }
}

class Program
{
    static void Serialize(MyData myData)
    {
        using (var stream = new FileStream("data.bin", FileMode.Create))
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, myData);
        }
    }

    // 示例用法
    static void Main(string[] args)
    {
        MyData data = new MyData { Value = 42 };
        Serialize(data);
    }
}
2. XML序列化

XML序列化使用 XmlSerializer 类,生成或解析XML格式的数据。它更适用于跨平台或跨语言的场景。

csharp 复制代码
using System;
using System.IO;
using System.Xml.Serialization;

public class MyData
{
    public int Value { get; set; }
}

class Program
{
    static void Serialize(MyData myData)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(MyData));
        using (var stream = new FileStream("data.xml", FileMode.Create))
        {
            serializer.Serialize(stream, myData);
        }
    }

    // 示例用法
    static void Main(string[] args)
    {
        MyData data = new MyData { Value = 42 };
        Serialize(data);
    }
}
3. JSON序列化

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在C#中,可以使用 System.Text.JsonNewtonsoft.Json即Json.NET)库进行JSON的序列化和反序列化。

使用 System.Text.Json 序列化:

csharp 复制代码
using System;
using System.IO;
using System.Text.Json;

public class MyData
{
    public int Value { get; set; }
}

class Program
{
    static void Serialize(MyData myData)
    {
        string jsonString = JsonSerializer.Serialize(myData);
        File.WriteAllText("data.json", jsonString);
    }

    // 示例用法
    static void Main(string[] args)
    {
        MyData data = new MyData { Value = 42 };
        Serialize(data);
    }
}

反序列化

反序列化是序列化的逆过程,即将存储或传输的格式转换回对象。对于上述示例,可以使用相应的反序列化方法来恢复对象状态。

注意事项

  • 确保被序列化的类是可序列化的(对于二进制序列化,通常需要标记为 [Serializable])。
  • 序列化数据时,要注意数据的安全性和隐私性,特别是当数据通过网络传输时。
  • 对于XML和JSON序列化,可以自定义序列化的格式和行为,比如忽略某些属性或自定义属性名。
  • 序列化机制的选择取决于你的具体需求,包括性能、兼容性、可读性等因素。
相关推荐
fenglllle10 分钟前
JDK8升级JDK17使用CompletableFuture在线程中classloader的变化
java·开发语言·jvm
froginwe1112 分钟前
Scala 正则表达式
开发语言
时寒的笔记13 分钟前
11期_js逆向核心案例解析(sichuan&某理财网)
开发语言·javascript·ecmascript
csbysj202015 分钟前
PHP 文件:深入解析与最佳实践
开发语言
JAVA面经实录91720 分钟前
Java+SpringAI企业级实战项目完整官方文档(生产终版)
java·开发语言·spring·ai编程
梵得儿SHI20 分钟前
Java IO 流进阶:Buffer 与 Channel 核心概念解析及与传统 IO 的本质区别
java·开发语言·高并发·nio·channel·buffer·提升io效率
j_xxx404_23 分钟前
Linux线程:从内存分页机制(Page Table/TLB/Page Fault)彻底读懂 Linux 线程本质
linux·运维·服务器·开发语言·c++·人工智能·ai
2301_7890156225 分钟前
C++_string增删查改模拟实现
java·开发语言·c++
星河耀银海26 分钟前
JAVA 注解(Annotation):从原理到实战应用
java·开发语言·数据库
AI人工智能+电脑小能手28 分钟前
【大白话说Java面试题 第68题】【JVM篇】第28题:对于 JDK 自带的监控和性能分析工具用过哪些?一般你怎么用的?
java·开发语言·jvm·面试