跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java序列化
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Java序列化}} '''Java序列化'''是将对象转换为字节流的过程,以便存储或传输,而'''反序列化'''则是将字节流重新转换为对象的过程。这一机制广泛用于网络通信、持久化存储和分布式计算中。 == 概述 == Java序列化通过{{code|java.io.Serializable}}接口实现,该接口是一个标记接口(无方法定义)。任何实现了{{code|Serializable}}的类都可以被序列化。序列化的核心类是{{code|ObjectOutputStream}}和{{code|ObjectInputStream}}。 === 核心特性 === * **跨平台性**:序列化后的字节流可在不同JVM或操作系统间传输。 * **持久化**:对象可保存到文件或数据库中。 * **安全性**:可通过{{code|transient}}关键字标记敏感字段,避免序列化。 == 基本用法 == 以下是一个简单的序列化与反序列化示例: <syntaxhighlight lang="java"> import java.io.*; // 实现Serializable接口 class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } public class SerializationDemo { public static void main(String[] args) { // 序列化 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) { Person person = new Person("Alice", 30); oos.writeObject(person); System.out.println("序列化完成: " + person); } catch (IOException e) { e.printStackTrace(); } // 反序列化 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) { Person deserializedPerson = (Person) ois.readObject(); System.out.println("反序列化结果: " + deserializedPerson); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } } </syntaxhighlight> === 输出示例 === <pre> 序列化完成: Person{name='Alice', age=30} 反序列化结果: Person{name='Alice', age=30} </pre> == 关键细节 == === transient关键字 === 阻止字段被序列化: <syntaxhighlight lang="java"> private transient String password; // 不会被序列化 </syntaxhighlight> === serialVersionUID === 用于版本控制,确保序列化兼容性: <syntaxhighlight lang="java"> private static final long serialVersionUID = 1L; </syntaxhighlight> == 实际应用场景 == 1. **分布式系统**:如RMI(远程方法调用)中传输对象。 2. **缓存存储**:将对象序列化后存入Redis等缓存系统。 3. **游戏存档**:保存游戏状态到本地文件。 == 序列化流程图示 == <mermaid> sequenceDiagram participant App as 应用程序 participant OOS as ObjectOutputStream participant File as 文件/网络 participant OIS as ObjectInputStream App->>OOS: writeObject() OOS->>File: 字节流 File->>OIS: 字节流 OIS->>App: readObject() </mermaid> == 高级主题 == === 自定义序列化 === 通过实现{{code|writeObject}}和{{code|readObject}}方法控制序列化过程: <syntaxhighlight lang="java"> private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); // 默认序列化 // 自定义逻辑 } </syntaxhighlight> === 外部化(Externalizable) === 更高效但需手动实现序列化逻辑的接口: <syntaxhighlight lang="java"> class CustomObject implements Externalizable { public void writeExternal(ObjectOutput out) { /* 手动序列化 */ } public void readExternal(ObjectInput in) { /* 手动反序列化 */ } } </syntaxhighlight> == 注意事项 == * **性能**:序列化可能产生较大字节流,影响传输效率。 * **安全**:反序列化可能引发漏洞(如{{code|Serializable}}攻击)。 * **兼容性**:修改类定义可能导致反序列化失败。 == 总结 == Java序列化是对象持久化和传输的核心技术,适合初学者快速上手,但也需注意高级特性与潜在风险。通过合理使用{{code|transient}}和{{code|serialVersionUID}},可以优化其安全性和兼容性。 [[Category:编程语言]] [[Category:Java]] [[Category:Java IO]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Code
(
编辑
)