“自定义序列化过程”在不同语言/框架里做法不一样,但核心思想都是:在对象 ↔ 字节流(或字符串)转换时,注入你自己的逻辑。下面按常见场景给你一个清晰、实用的总结。
默认序列化通常是:
自定义序列化就是:
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());
}
}
✅ 适合:
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();
}
}
⚠️ 风险:字段顺序、版本必须严格一致
@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();
}
}
✅ 适合:
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.dumps)def user_to_dict(user):
return {
"username": user.name,
"age": user.age
}
json.dumps(user, default=user_to_dict)
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 |
❌ 不需要自定义的情况:
✅ 需要自定义的情况:
你可以直接告诉我:
我可以给你完全贴合你项目的示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。