使用RMI进行Java序列化

时间:2010-12-05 00:29:40

标签: serialization rmi

我正在使用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进行的。

我怎么会有这样的错误?

2 个答案:

答案 0 :(得分:3)

您无法序列化读者和作者。这没有道理。这就像试图通过电话线发送电话一样。如果要发送文件,请发送文件。

您的代码只是在这些对象上调用writeObject,就好像它们是Serializable一样。他们不是。否则,你可以使它们非瞬态,并完全省略了自定义的readObject和writeObject方法。只是重新编码系统本来会做的事情并没有改变任何东西。它当然不会使类Serializable不是。

答案 1 :(得分:3)

如果您不想通过RMI重新实现文件/流发送,可以查看RMIIO,它会以简洁有效的方式处理这些事情。