跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java ObjectInputStream
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本教程适用于Java 8及以上版本。部分特性在早期版本中可能不可用。}} = Java ObjectInputStream 全面指南 = '''ObjectInputStream''' 是Java I/O系统中用于'''反序列化'''对象的核心类,它属于<code>java.io</code>包,与[[ObjectOutputStream]]配合使用实现对象的持久化存储和网络传输。 == 核心概念 == ObjectInputStream的主要功能是从输入流中读取被序列化的Java对象,并将其还原为内存中的对象实例。这个过程称为'''反序列化'''(Deserialization)。 === 序列化与反序列化 === <mermaid> graph LR A[内存对象] -->|序列化| B[字节序列] B -->|反序列化| A </mermaid> 数学表示: <math> \text{deserialize} : \text{byte[]} \rightarrow \text{Object} </math> == 基础用法 == === 类声明 === <syntaxhighlight lang="java"> public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants </syntaxhighlight> === 基本示例 === 从文件读取对象: <syntaxhighlight lang="java"> try (FileInputStream fis = new FileInputStream("data.obj"); ObjectInputStream ois = new ObjectInputStream(fis)) { // 读取对象 Object obj = ois.readObject(); if (obj instanceof Person) { Person p = (Person) obj; System.out.println("反序列化对象: " + p); } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } </syntaxhighlight> 假设<code>Person</code>类已实现<code>Serializable</code>接口,输出可能是: <pre> 反序列化对象: Person{name='John', age=30} </pre> == 关键方法详解 == {| class="wikitable" ! 方法 !! 描述 |- | <code>readObject()</code> || 读取并反序列化对象 |- | <code>readInt()</code> || 读取32位整数 |- | <code>readUTF()</code> || 读取UTF-8格式字符串 |- | <code>defaultReadObject()</code> || 使用默认机制反序列化非静态/瞬态字段 |- | <code>readFields()</code> || 读取序列化字段 |} === 自定义反序列化 === 通过实现<code>private void readObject(ObjectInputStream ois)</code>方法: <syntaxhighlight lang="java"> private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { // 默认反序列化 ois.defaultReadObject(); // 自定义处理 this.timestamp = System.currentTimeMillis(); } </syntaxhighlight> == 安全注意事项 == '''重要警告''':反序列化不受信任的数据可能导致严重安全问题: * 远程代码执行(RCE) * 拒绝服务攻击(DoS) 防护措施: 1. 使用<code>ObjectInputFilter</code>(Java 9+) 2. 验证序列化UID 3. 避免反序列化不可信来源数据 === 过滤器示例 === <syntaxhighlight lang="java"> ObjectInputFilter filter = info -> { if (info.serialClass() != null && info.serialClass().getName().equals("com.example.Person")) { return ObjectInputFilter.Status.ALLOWED; } return ObjectInputFilter.Status.REJECTED; }; ois.setObjectInputFilter(filter); </syntaxhighlight> == 高级特性 == === 版本控制 === 使用<code>serialVersionUID</code>保持版本兼容: <syntaxhighlight lang="java"> private static final long serialVersionUID = 1L; </syntaxhighlight> === 替代机制 === 对于复杂场景,可考虑: * <code>Externalizable</code>接口 * JSON/XML序列化库(如Jackson、Gson) == 实际应用案例 == === 分布式系统通信 === <mermaid> sequenceDiagram Client->>Server: 序列化对象(通过ObjectOutputStream) Server->>Server: 处理请求 Server->>Client: 返回序列化响应(通过ObjectInputStream) </mermaid> === 持久化存储 === <syntaxhighlight lang="java"> // 保存游戏状态 public void saveGame(Player player, String filename) { try (ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(filename))) { oos.writeObject(player); } catch (IOException e) { System.err.println("保存失败: " + e.getMessage()); } } // 加载游戏 public Player loadGame(String filename) { try (ObjectInputStream ois = new ObjectInputStream( new FileInputStream(filename))) { return (Player) ois.readObject(); } catch (IOException | ClassNotFoundException e) { System.err.println("加载失败: " + e.getMessage()); return null; } } </syntaxhighlight> == 常见问题 == === 反序列化失败原因 === 1. 类未实现<code>Serializable</code> 2. serialVersionUID不匹配 3. 类定义发生不兼容变更 4. 流数据损坏 === 性能优化 === * 使用缓冲流(<code>BufferedInputStream</code>) * 批量处理对象 * 考虑替代序列化方案(如Protocol Buffers) == 最佳实践 == 1. 始终显式声明serialVersionUID 2. 对敏感字段使用<code>transient</code> 3. 实现<code>readObject()</code>时保持防御性编程 4. 在finally块中关闭流或使用try-with-resources {{Tip|对于新项目,建议考虑更现代的序列化方案如JSON或Protocol Buffers,它们提供更好的跨语言支持和安全性。}} == 参见 == * [[Serializable接口]] * [[ObjectOutputStream]] * [[Java序列化机制]] [[Category:编程语言]] [[Category:Java]] [[Category:Java IO]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Note
(
编辑
)
模板:Tip
(
编辑
)