温馨提示×

温馨提示×

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

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

怎么自定义序列化

发布时间:2026-10-25 16:29:21 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

“自定义序列化”在不同语言/框架里做法差别很大,我按常见场景给你讲一下,你可以对号入座。


一、Java(最常见)

1. 实现 Serializable + 特殊方法

Java 原生序列化可重写:

private void writeObject(ObjectOutputStream out) throws IOException {
    out.writeUTF(name);
    out.writeInt(age);
}

private void readObject(ObjectInputStream in)
        throws IOException, ClassNotFoundException {
    name = in.readUTF();
    age = in.readInt();
}

✅ 用于控制字段如何写/读


2. 使用 Externalizable

完全自己控制:

public 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 {
        name = in.readUTF();
        age = in.readInt();
    }
}

3. JSON 自定义(Jackson)

最常见方式:

public class User {
    @JsonSerialize(using = CustomSerializer.class)
    private Date birthDate;
}
public class CustomSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider sp)
            throws IOException {
        gen.writeString(new SimpleDateFormat("yyyy-MM-dd").format(value));
    }
}

二、Python

1. pickle 自定义

class User:
    def __reduce__(self):
        return (User, (self.name, self.age))

2. dataclass + json

import json
from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

    def to_json(self):
        return {"name": self.name, "age": self.age}

或自定义 JSONEncoder:

class CustomEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, User):
            return o.to_json()
        return super().default(o)

三、C#(.NET)

public class User
{
    [JsonConverter(typeof(CustomConverter))]
    public DateTime Birth { get; set; }
}

或实现:

public interface ISerializable

四、前端(JS / TypeScript)

JSON.stringify(obj, (key, value) => {
  if (key === "date") return value.getTime();
  return value;
});

五、什么时候需要“自定义序列化”?

✅ 隐藏敏感字段
✅ 改字段名
✅ 时间/枚举格式化
✅ 兼容老系统
✅ 减少体积


如果你告诉我:

  • 用的语言
  • 序列化格式(JSON / 二进制 / Protobuf)
  • 具体想“自定义什么”

我可以直接给你可用代码模板。

向AI问一下细节

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

AI
助
手