当前位置: 首页 > news >正文

Java 中序列化和反序列化

Java 中的序列化(Serialization)和反序列化(Deserialization)是将对象和二进制数据(或其他格式)之间转换的过程,常见于对象传输、缓存、持久化等场景。

下面是 Java 中常见的几种 序列化/反序列化方式 👇:

🔹 1. Java 自带的序列化(JDK 默认)

✅ 特点:

  • 使用 ObjectOutputStream / ObjectInputStream
  • 类必须实现 Serializable 接口
  • 输出是二进制格式

💡 示例:

// 序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.ser"));
oos.writeObject(myObject);
oos.close();

// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.ser"));
MyClass obj = (MyClass) ois.readObject();
ois.close();

⚠️ 缺点:

  • 不跨语言
  • 可读性差(是二进制)
  • 修改类结构后容易出错(除非加 serialVersionUID

🔹 2. JSON 序列化(如 Jackson、Gson、Fastjson)

✅ 特点:

  • 可读性强(文本格式)
  • 跨语言、轻量
  • 易调试、常用于 Web 接口通信

💡 Jackson 示例:

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(myObject); // 序列化
MyClass obj = mapper.readValue(json, MyClass.class); // 反序列化

🔹 3. XML 序列化(如 JAXB)

✅ 特点:

  • 结构清晰
  • 可跨平台、跨语言
  • 常用于老系统或配置文件

💡 JAXB 示例:

// 序列化
JAXBContext context = JAXBContext.newInstance(MyClass.class);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(myObject, new File("data.xml"));

// 反序列化
Unmarshaller unmarshaller = context.createUnmarshaller();
MyClass obj = (MyClass) unmarshaller.unmarshal(new File("data.xml"));

🔹 4. Hessian / Kryo / Protobuf / Avro 等高性能方案

🏎️ Kryo

  • 高性能二进制序列化库
  • 比 Java 默认序列化快得多
  • 适用于游戏、缓存、RPC 等场景
Kryo kryo = new Kryo();
Output output = new Output(new FileOutputStream("file.bin"));
kryo.writeObject(output, myObject);
output.close();

🧠 Protobuf(Google Protocol Buffers)

  • 跨语言、高压缩比、高性能
  • 常用于 RPC 框架(gRPC 等)

🔹 5. 自定义序列化

实现 Externalizable 接口,自定义 read/write 逻辑。

public class MyClass implements Externalizable {
    private String name;
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(name);
    }
    public void readExternal(ObjectInput in) throws IOException {
        name = in.readUTF();
    }
}

🧾 总结对比表:

方式格式跨语言性能是否可读
JDK 原生二进制一般
JSON (Jackson)文本中等
XML (JAXB)文本较慢
Kryo二进制
Protobuf二进制非常快
Externalizable自定义视实现而定取决于你

相关文章:

  • C语言【模仿strcpy】
  • kkFileView的安装和使用
  • fabric test-network启动
  • RAI Toolbox详解
  • 同一个网段下内网机器通过转发网络到堡垒机来访问外网的方式
  • Java进阶版线程池(超详细 )
  • TorchServe部署模型-index_to_name.json
  • 硕日新能SRNE Solar 荣获 TÜV NORD 目击实验室认可资质!
  • FRP驱动本地摄像头实现远程图传
  • js异步机制
  • Unity3D多线程与协程优化分析
  • 【资料分享】瑞芯微RK3506(3核ARM+Cortex-A7 + ARM Cortex-M0)工业核心板选型资料
  • 【KWDB 创作者计划】_ruby基础语法
  • JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解
  • C语言【输出字符串中的大写字母】
  • Codeforces Round 1016 (Div. 3)
  • vue3前一月/年+后一月/年
  • 基于springcloud的“微服务架构的巡游出租管理平台”的设计与实现(源码+数据库+文档+PPT)
  • 【Linux】jumpserver开源堡垒机部署
  • 【时时三省】(C语言基础)选择结构的嵌套
  • 公司网站建设 wordpress/百度推广代理怎么加盟
  • 西安市规划建设局网站/爱站网关键词挖掘查询
  • 建设企业网站电话是多少/正规网站建设服务
  • 上海在线做网站/营销网络是啥意思
  • 可以做app的网站/长沙百度快照优化排名
  • 做网站怎么能在百度搜索到/seo成创网络