温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何自定义序列化过程

发布时间:2026-07-24 09:49:21 来源:亿速云 阅读:105 作者:小樊 栏目:编程语言

“自定义序列化过程”在不同语言/框架里做法不一样,但核心思想都是:在对象 ↔ 字节流(或字符串)转换时,注入你自己的逻辑。下面按常见场景给你一个清晰、实用的总结。


一、什么是“自定义序列化”

默认序列化通常是:

  • 按字段名
  • 按可见性(public / private)
  • 按语言默认规则

自定义序列化就是:

  • 控制 哪些字段被序列化
  • 控制 字段名、格式、顺序
  • 控制 读写过程本身

二、Java 中的自定义序列化(最常见)

✅ 方式 1:writeObject / readObject(经典)

class User implements Serializable {
    private String name;
    private transient String password; // 不自动序列化

    private void writeObject(ObjectOutputStream out)
            throws IOException {
        out.defaultWriteObject(); // 先序列化非 transient 字段
        out.writeObject(encrypt(password)); // 自定义处理
    }

    private void readObject(ObjectInputStream in)
            throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        password = decrypt((String) in.readObject());
    }
}

✅ 适合:

  • 加解密
  • 脱敏
  • 兼容旧版本

✅ 方式 2:Externalizable(完全接管)

class User implements Externalizable {
    private String name;
    private int age;

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(name);
        out.writeInt(age);
    }

    @Override
    public void readExternal(ObjectInput in)
            throws IOException, ClassNotFoundException {
        name = in.readUTF();
        age = in.readInt();
    }
}

⚠️ 风险:字段顺序、版本必须严格一致


✅ 方式 3:JSON 序列化(Jackson / Gson)

Jackson 示例

@JsonSerialize(using = UserSerializer.class)
@JsonDeserialize(using = UserDeserializer.class)
class User {
    String name;
}
class UserSerializer extends JsonSerializer<User> {
    @Override
    public void serialize(User user, JsonGenerator gen, SerializerProvider provider)
            throws IOException {
        gen.writeStartObject();
        gen.writeStringField("username", user.name);
        gen.writeEndObject();
    }
}

✅ 适合:

  • REST API
  • 前后端交互
  • 字段名映射

三、Python 中的自定义序列化

✅ pickle 自定义

class User:
    def __init__(self, name, password):
        self.name = name
        self.password = password

    def __getstate__(self):
        state = self.__dict__.copy()
        state["password"] = encrypt(state["password"])
        return state

    def __setstate__(self, state):
        state["password"] = decrypt(state["password"])
        self.__dict__.update(state)

✅ JSON(json.dumps)

def user_to_dict(user):
    return {
        "username": user.name,
        "age": user.age
    }

json.dumps(user, default=user_to_dict)

四、C# 中的自定义序列化

✅ ISerializable

[Serializable]
class User : ISerializable
{
    public string Name;

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("username", Name);
    }

    protected User(SerializationInfo info, StreamingContext context)
    {
        Name = info.GetString("username");
    }
}

五、常见自定义序列化场景

场景 推荐方式
字段加密 / 脱敏 writeObject / __getstate__
API 字段名映射 Jackson / JSON
版本兼容 serialVersionUID / 显式字段
性能优化 Externalizable(慎用)
跨语言 JSON / Protobuf

六、什么时候不该自定义?

❌ 不需要自定义的情况:

  • 简单 POJO
  • 框架已自动处理
  • 没有安全 / 兼容需求

✅ 需要自定义的情况:

  • 敏感数据
  • 老系统兼容
  • 非标准格式
  • 精细控制字段

七、如果你愿意,我可以进一步帮你

你可以直接告诉我:

  1. 使用语言(Java / Python / C# / Go / JS)
  2. 序列化形式(二进制 / JSON / Protobuf / Hessian)
  3. 具体需求(脱敏?版本兼容?字段改名?)

我可以给你完全贴合你项目的示例代码。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手