我已成功序列化 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()到达。
答案 0 :(得分:3)
在反序列化类时,您需要在类路径中包含类文件,因为反序列化格式仅包含类非瞬态非静态字段的值。
答案 1 :(得分:3)
序列化Class
对象只存储对类名的引用,它实际上并不存储类字节码(嗯,它实际上比实际上稍微复杂,但效果是相同的)。在反序列化时,ObjectInputStream
将尝试从其自己的类加载器按名称加载类,因此该类需要可以通过该类加载器访问。
答案 2 :(得分:0)
反序列化序列化对象时,对象的类必须位于类路径上。
在此上下文中,ClassNotFoundException
最有可能意味着所需的类不在类路径上。您必须解决此问题才能使反序列化工作。
答案 3 :(得分:0)
您正在尝试序列化一个不包含任何数据的类,因为它是一个类。 如果要发送类,请发送.class文件的字节并使用类加载器加载它 序列化的目的是将对象转换为字节并将其转换回来。
答案 4 :(得分:0)
如果要加载类文件不在类路径上的类,则需要使用ClassLoader.defineClass。作为参数传递给该方法的字节数组应该包含类文件的内容(不是序列化类对象)。
答案 5 :(得分:0)
如果要将类从流的一端传输到另一端,可以将.class
文件本身推送到流上,将其保存到文件中,然后使用ClassLoader
将它加载到JVM中的装置。我不知道这在JVM版本等方面是多么便携。