java 序列化 - 持久化类定义

Posted

技术标签:

【中文标题】java 序列化 - 持久化类定义【英文标题】:java serialization - persist class definition 【发布时间】:2012-01-24 10:41:13 【问题描述】:

我对 java 中的序列化有所了解。我的基本理解是,它是一种持久化对象状态并将其写入流的机制,以便我们可以在稍后的任何时间点或在未创建对象的任何其他“JVM”中膨胀和使用它。 现在假设如果我有一个类 A 并创建一个类 A 的实例,即对象 a ,将其序列化并将其存储在文件 "A.ser" 中。我将文件复制到其他系统并反序列化文件“A.ser”以获得对象 a 的持久状态。但是在那种情况下, A 的类定义应该存在于我反序列化对象的另一个系统中!有什么方法可以保存类定义并将其传输到另一个系统,以便其他 JVM 在我们反序列化文件获取类定义并在那里重建类之前不知道类 A 是什么?

【问题讨论】:

【参考方案1】:

你描述的是一个类加载器。为了能够在类路径中没有 A 的 JVM 中加载类 A,您需要使用 ClassLoader 来加载该类(及其依赖项)。

然后,ObjectInputSTream 必须委托给自定义类加载器来解析其类。

请参阅https://forums.oracle.com/forums/thread.jspa?threadID=1149865 中的最后一篇文章以获取执行此操作的示例。 Spring也有such an ObjectInputStream。

【讨论】:

【参考方案2】:

让我们考虑一下,对于反序列化,您不需要这些类。但是在反序列化之后你会怎么做,因为你不能在没有类定义的情况下执行对象?

这就是反序列化找不到类定义时抛出ClassNotFoundException的原因。您可以将类定义作为 jar 分发。

【讨论】:

【参考方案3】:

不使用序列化,您必须将类文件单独存储,还要评估依赖关系并将它们捆绑在一起。

所以,你必须序列化对象,找到它的 .class 文件,检测依赖的类,找到它们的 .class 文件,直到你有已解决所有依赖项都已解决。

正如您可能想象的那样,这不是一项简单的任务,因此请将这些内容与您的类 jar 文件一起发送并完成。

【讨论】:

【参考方案4】:

一个想法是让接收系统从远程registry 下载类定义。您必须使用反射获取类的名称。只是猜测,我从未尝试过。

【讨论】:

以上是关于java 序列化 - 持久化类定义的主要内容,如果未能解决你的问题,请参考以下文章

Qt持久性对象进行序列化(同时比较了MFC与Java的方法)

Hadoop序列化与Java序列化

java中为什么实体类需要实现序列化

java实体类为啥要实现serlializable接口

序列化介绍 及 常见序列化协议(JDKKryoProtobufHessian)解析

Java序列化技术