“外部序列化”这个说法在不同技术语境下含义不太一样,下面按最常见的几种情况给你讲清楚怎么用。
一般指:对象本身不负责序列化逻辑,而是由外部工具/类来完成序列化与反序列化。
和“内部序列化”(如 Java 的 Serializable、Python 的 pickle)相对。
核心思想:
数据对象 ≠ 序列化逻辑
ExternalizableJava 提供 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();
✅ 特点:
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
User u = mapper.readValue(json, User.class);
Gson gson = new Gson();
String json = gson.toJson(user);
User u = gson.fromJson(json, User.class);
message User {
string name = 1;
int32 age = 2;
}
byte[] data = user.toByteArray();
User u = User.parseFrom(data);
✅ 优点:
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)))
✅ 推荐用外部序列化,当:
❌ 不推荐:
外部序列化 = 把“怎么存”从“对象本身”里拿出来,交给框架或接口处理
如果你指的是某个具体语言 / 框架(如 Unity、Go、C++、Netty),告诉我,我可以直接给你对应示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。