【问题标题】:Java ObjectInputStream reading from different ApplicationJava ObjectInputStream 从不同的应用程序读取
【发布时间】:2025-12-01 04:35:01
【问题描述】:

我将ArrayList<MyClass> 保存为带有ObjectOutputStream 的对象。现在,我如何使用ObjectInputStream 在我的另一个应用程序项目中读取该对象?我试过了,它抛出了一个ClassNotFoundException。我已将 MyClass 从项目 1 复制到项目 2。我还需要做什么吗?

【问题讨论】:

  • 你为什么用FileInputStream而不是ObjectInputStream来阅读?您是否检查了两个类是否具有相同的serialVersionUID?如果这没有帮助,请您过去整个异常和最近的代码吗?
  • “复制”是什么意思。你不应该复制它。您应该使用完全相同的类。
  • 我很糟糕,我也在另一个项目中使用 ObjectInputStream..我将编辑问题
  • 复制我的意思是复制粘贴类源代码和类名..

标签: java class serialization objectinputstream


【解决方案1】:

您不应该复制一个类并期望它看起来相同 - Java 编译器/JVM 会注意到更改。使用完全相同的类文件!!!

有几个版本可以这样做:

  • 交付 Project1 和 Project2 并设置您的 CLASSPATH
  • 同一个包中的类文件复制到Project2
  • 将一个 Jar 附加到包含 MyClass 的 Project2

还有一点你永远不会忘记:每个Serializable 都应该有一个serialVersionUID Eclipse 会自动发出警告 - 单击它并生成它。如果您没有 Eclipse,请使用 JDK 中的serialver
但不要忘记:如果您的课程发生了变化,以至于旧版本无法被新版本解释,请更改 serialversionUID

【讨论】:

  • 每个 Serializable 都应该有一个 serialVersionUID:没有。那不是真的。如果您不知道它是什么、如何使用它以及如何更改您的类并使其与序列化版本保持向后兼容,则添加一个 serialVersionUID 只会给您的代码添加噪音。
  • @JBNizet 这不是真的。我有相同的 JAR 文件,其中包含 Object[Input|Output]Stream 在 Linux 和 Windows 上运行,并且在一个操作系统上创建的文件没有在另一个操作系统上运行,除了那些 serialVersionUID 不匹配
  • 那么您可能有同一个类的 2 个版本,但由两个不同的编译器编译。见docs.oracle.com/javase/7/docs/platform/serialization/spec/…
  • @JBNizet 不,它确实是同一个 JAR 文件
最近更新 更多