0

我已经成功序列化了Ghost类:

class Ghost {}

File file = new File("serialized.class.bin");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(Ghost.class);

然后我试图在不同的应用程序中恢复它:

InputStream is = new FileInputStream(new File("serialized.class.bin"));
ObjectInputStream ois = new ObjectInputStream(is);
Object o = ois.readObject();

我收到错误,在(尝试)加载它时错过了类:

java.lang.ClassNotFoundException: Ghost

反序列化类时我可能无法访问Ghost.class文件。是否可以以这种方式传输 Java 类?

升级版。我假设在序列化类时正在转储类定义(字节码)。我错了。不过,通过getResourceAsStream()可以达到目标。

4

6 回答 6

5

序列化Class对象只是存储对类名的引用,它实际上并不存储类字节码(嗯,它比实际操作稍微复杂一些,但效果是一样的)。在反序列化时,ObjectInputStream将尝试从其自己的类加载器中按名称加载类,因此该类需要已经可以通过该类加载器访问。

于 2012-11-27T12:56:42.450 回答
3

反序列化类时,您需要在类路径中包含类文件,因为反序列化格式仅包含类非瞬态非静态字段的值。

于 2012-11-27T12:53:30.957 回答
0

当你反序列化一个序列化对象时,对象的类必须在类路径上。

在这种情况下,aClassNotFoundException很可能意味着所需的类不在类路径上。您必须解决这个问题才能使反序列化工作。

于 2012-11-27T12:55:14.927 回答
0

您正在尝试序列化一个不包含任何数据的类,因为它是一个类。如果要发送类,请发送 .class 文件的字节并使用类加载器加载它。
序列化的目的是将对象转换为字节并将其转换回来。

于 2012-11-27T12:56:49.610 回答
0

如果要加载类文件不在类路径上的类,则需要使用ClassLoader.defineClass。作为参数传递给该方法的字节数组应该包含类文件的内容(而不是序列化的类对象)。

于 2012-11-27T12:58:08.403 回答
0

如果您想将一个类从流的一端传输到另一端,您可以将.class文件本身推送到流上,将其保存到文件中,然后使用该ClassLoader设备将其加载到 JVM 中。我不知道这在 JVM 版本等方面的可移植性如何。

于 2012-11-27T13:57:55.553 回答