温馨提示×

温馨提示×

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

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

外部序列化怎么用

发布时间:2026-10-25 17:59:24 来源:亿速云 阅读:94 作者:小樊 栏目:编程语言

“外部序列化”这个说法在不同技术语境下含义不太一样,下面按最常见的几种情况给你讲清楚怎么用。


一、什么是“外部序列化”

一般指:对象本身不负责序列化逻辑,而是由外部工具/类来完成序列化与反序列化。
和“内部序列化”(如 Java 的 Serializable、Python 的 pickle)相对。

核心思想:

数据对象 ≠ 序列化逻辑


二、Java 中的外部序列化(最常见)

1️⃣ 使用 Externalizable

Java 提供 Externalizable 接口,比 Serializable 更“外部控制”。

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

    // 必须有无参构造
    public User() {}

    @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();
    }
}

使用:

ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("user.dat"));
oos.writeObject(user);

ObjectInputStream ois = new ObjectInputStream(
        new FileInputStream("user.dat"));
User u = (User) ois.readObject();

✅ 特点:

  • 序列化字段完全自己控制
  • 性能更好
  • 不依赖 JVM 默认机制

三、更常见的“外部序列化”方式(推荐)

2️⃣ 使用外部序列化框架(解耦)

✅ Jackson(JSON)

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
User u = mapper.readValue(json, User.class);

✅ Gson

Gson gson = new Gson();
String json = gson.toJson(user);
User u = gson.fromJson(json, User.class);

✅ Protocol Buffers / Proto

message User {
  string name = 1;
  int32 age = 2;
}
byte[] data = user.toByteArray();
User u = User.parseFrom(data);

✅ 优点:

  • 对象不需要实现任何接口
  • 跨语言
  • 易维护

四、Python 中的“外部序列化”

Python 本身多用 pickle(内部),但“外部”通常这样用:

import json

data = json.dumps(user.__dict__)
user = User(**json.loads(data))

或使用 dataclasses + asdict:

from dataclasses import asdict, dataclass
import json

@dataclass
class User:
    name: str
    age: int

json.dumps(as_dataclass(User, asdict(user)))

五、什么时候该用“外部序列化”?

✅ 推荐用外部序列化,当:

  • 不想污染业务类
  • 需要跨语言
  • 需要版本兼容
  • 需要高性能(PB / MsgPack)

❌ 不推荐:

  • 简单一次性内存对象
  • 没有序列化需求

六、一句话总结

外部序列化 = 把“怎么存”从“对象本身”里拿出来,交给框架或接口处理

如果你指的是某个具体语言 / 框架(如 Unity、Go、C++、Netty),告诉我,我可以直接给你对应示例。

向AI问一下细节

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

AI
助
手