C# ISerializable 允许对象控制自己的序列化/反序列化过程

1. 官方定义(你可直接写文档)

ISerializable 是 .NET 提供的自定义序列化接口 ,允许类型完全控制自身对象的序列化与反序列化过程。实现该接口的对象可以决定:

  • 哪些字段要序列化
  • 哪些字段不序列化
  • 序列化时存什么数据
  • 反序列化时怎么还原对象

2. 核心作用(大白话)

  • 不让系统自动瞎序列化
  • 自己决定存什么、读什么
  • 兼容版本升级
  • 保护敏感字段
  • 自定义对象还原逻辑

3. 必须实现的两个东西

  1. GetObjectData(...) → 序列化时调用:把对象写进去
  2. 构造函数 (SerializationInfo, StreamingContext) → 反序列化时调用:把对象读回来

4. 最简单标准模板(你可直接用)

csharp

运行

复制代码
using System;
using System.Runtime.Serialization;

[Serializable] // 必须加
public class MyClass : ISerializable
{
    public int Id { get; set; }
    public string Name { get; set; }

    // 空构造(可选)
    public MyClass() { }

    // ============================
    // 【1】反序列化构造函数
    // ============================
    protected MyClass(SerializationInfo info, StreamingContext context)
    {
        Id = info.GetInt32(nameof(Id));
        Name = info.GetString(nameof(Name));
    }

    // ============================
    // 【2】序列化方法(ISerializable)
    // ============================
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue(nameof(Id), Id);
        info.AddValue(nameof(Name), Name);
    }
}

5. 为什么要用 ISerializable?(重点)

✅ 自定义控制(最关键)

系统默认序列化会把所有 public/private 字段都序列化你可以:

  • 只序列化部分字段
  • 不序列化临时变量
  • 不序列化大对象
  • 加密敏感数据

✅ 版本兼容

类升级后(加字段、删字段),反序列化不会崩

✅ 安全控制

密码、密钥等不序列化

✅ 复杂对象还原

对象构造复杂 → 自己控制怎么还原


6. 你可以直接写进文档的正式描述

ISerializable 接口说明

ISerializable 是 .NET 平台提供的自定义序列化接口 ,用于实现对象的可控式二进制序列化与反序列化 。通过实现该接口,类型能够自主定义序列化数据的存储结构与还原逻辑,而非依赖框架自动序列化,从而实现数据筛选、版本兼容、安全控制、复杂对象还原等高级能力。


7. 超简短总结(写代码注释用)

plaintext

复制代码
ISerializable:允许对象完全控制自身的序列化与反序列化过程。
相关推荐
星夜离尘566 小时前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
_Evan_Yao6 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
zwm2698888156 小时前
hd 3#负一西送风,能远程启不能远程停
c#
Ai-_Man6 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd6 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼6 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
学逆向的7 小时前
C 枚举变量
c语言·开发语言·网络安全
Sakura_j_h_7 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
thefool1122667 小时前
TCP 1
java·1024程序员节
金銀銅鐵9 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程