当前位置: 首页 > article >正文

C#的序列化[Serializable()]

[Serializable] 是 .NET 框架中的一个特性(Attribute),用于标记一个类、结构体、枚举或委托可以被序列化。序列化是将对象的状态转换为可以存储或传输的格式(如二进制、XML 或 JSON)的过程,以便在需要时可以重新创建该对象。

主要用途:
持久化存储:将对象的状态保存到文件或数据库中,以便后续恢复。

跨进程或跨机器传输:在分布式系统中,将对象通过网络传输到其他进程或机器。

深拷贝对象:通过序列化和反序列化实现对象的深拷贝。

如何使用:
在类、结构体、枚举或委托上添加 [Serializable] 特性,即可使其支持序列化。例如:

[Serializable]
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

序列化示例:
以下是一个将对象序列化为二进制格式并保存到文件的示例:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable]
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main()
    {
        // 创建一个 Person 对象
        Person person = new Person("Alice", 30);

        // 序列化对象到文件
        BinaryFormatter formatter = new BinaryFormatter();
        using (FileStream stream = new FileStream("person.dat", FileMode.Create))
        {
            formatter.Serialize(stream, person);
        }

        Console.WriteLine("对象已序列化到文件。");

        // 从文件反序列化对象
        using (FileStream stream = new FileStream("person.dat", FileMode.Open))
        {
            Person deserializedPerson = (Person)formatter.Deserialize(stream);
            Console.WriteLine($"反序列化对象: Name = {deserializedPerson.Name}, Age = {deserializedPerson.Age}");
        }
    }
}

关键点:
默认序列化:使用 [Serializable] 特性后,.NET 会自动序列化所有字段(包括私有字段)。如果某些字段不需要序列化,可以使用 [NonSerialized] 特性标记。

[Serializable]
public class Person
{
    public string Name { get; set; }
    [NonSerialized]
    private int Age; // 这个字段不会被序列化
}

自定义序列化:如果需要控制序列化过程,可以实现 ISerializable 接口。

序列化格式:.NET 支持多种序列化格式,如二进制(BinaryFormatter)、XML(XmlSerializer)和 JSON(JsonSerializer)。

注意事项:
安全性:BinaryFormatter 已被标记为不安全,不建议在新代码中使用,因为它容易受到反序列化攻击。推荐使用更安全的序列化方式,如 System.Text.Json 或 XmlSerializer。

版本兼容性:序列化的对象在不同版本的程序之间可能存在兼容性问题,尤其是在字段或属性发生变化时。

性能:序列化和反序列化可能会影响性能,尤其是在处理大型对象或复杂对象图时。

替代方案:
System.Text.Json:用于 JSON 序列化和反序列化的高性能库。

XmlSerializer:用于 XML 序列化和反序列化。

DataContractSerializer:支持更复杂的序列化场景,通常用于 WCF 服务。

总结来说,[Serializable] 是 .NET 中用于标记对象可序列化的特性,但在现代开发中,建议使用更安全、更灵活的序列化方式(如 JSON 或 XML)。


http://www.kler.cn/a/553422.html

相关文章:

  • Mongoose 详解
  • Kubernetes:EKS 中 Istio Ingress Gateway 负载均衡器配置及常见问题解析
  • 网页五子棋——对战前端
  • Swupdate升级不强制依赖version字段
  • 软考高级《系统架构设计师》知识点(七)
  • 全局动态组件uniapp(vue)
  • Qt常用控件之复选按钮QCheckBox
  • Spring Bean的生命周期执行流程
  • 解决 Mac 只显示文件大小,不显示目录大小
  • Python--数据类型(中)
  • 【数据挖掘】数据仓库
  • 《深度学习》——自然语言处理(NLP)
  • DeepSeek-R1:使用KTransformers部署(保姆级教程)
  • 月之暗面-KIMI-发布最新架构MoBA
  • 实现历史数据的插入、更新和版本管理-拉链算法
  • 我的2025年计划
  • 红外图像与可见光图像在目标检测时的区别
  • 【数据分析】通过个体和遗址层面的遗传相关性网络分析
  • 浪潮信息元脑R1服务器重塑大模型推理新标准
  • 【核心算法篇十四】《深度解密DeepSeek量子机器学习:VQE算法加速的黑科技与工程实践》