我正在使用Java RMI开发一个项目。 这是导致问题的类:
public class FSFile implements Serializable
{
public static final int READ = 0;
public static final int WRITE = 1;
private int flag;
private String filename;
private transient BufferedWriter writer;
private transient BufferedReader reader;
...
private void writeObject(ObjectOutputStream stream) throws IOException
{
stream.defaultWriteObject();
stream.writeObject(writer);
stream.writeObject(reader);
}
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException
{
stream.defaultReadObject();
writer = (BufferedWriter) stream.readObject();
reader = (BufferedReader) stream.readObject();
}
}
基本上,我使用RMI将FSFile对象本地发送到另一个进程(现在),这是我得到的错误:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException;
java.io.BufferedReader
更确切地说,有一个名为FileService的类,它使用来自FileServer的函数fetch()来获取FSFile。 fetch()函数没有什么特别之处,它只是创建一个FSFile并返回它。这些类之间的所有通信都是通过RMI进行的。
我怎么会有这样的错误?
答案 0 :(得分:3)
您无法序列化读者和作者。这没有道理。这就像试图通过电话线发送电话一样。如果要发送文件,请发送文件。
您的代码只是在这些对象上调用writeObject,就好像它们是Serializable一样。他们不是。否则,你可以使它们非瞬态,并完全省略了自定义的readObject和writeObject方法。只是重新编码系统本来会做的事情并没有改变任何东西。它当然不会使类Serializable不是。
答案 1 :(得分:3)
如果您不想通过RMI重新实现文件/流发送,可以查看RMIIO,它会以简洁有效的方式处理这些事情。