通过序列化在应用程序之间传输Java类

时间:2012-11-27 12:51:23

标签: java serialization

我已成功序列化 class 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类?

UPD 即可。我假设在序列化类时正在转储类定义(字节码)。我错了。目标可通过getResourceAsStream()到达。

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

反序列化序列化对象时,对象的类必须位于类路径上。

在此上下文中,ClassNotFoundException最有可能意味着所需的类不在类路径上。您必须解决此问题才能使反序列化工作。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果要将类从流的一端传输到另一端,可以将.class文件本身推送到流上,将其保存到文件中,然后使用ClassLoader将它加载到JVM中的装置。我不知道这在JVM版本等方面是多么便携。