Serialization 用RMI实现Java序列化

Serialization 用RMI实现Java序列化,serialization,rmi,Serialization,Rmi,我正在使用JavaRMI进行一个项目。 这是导致问题的类: 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

我正在使用JavaRMI进行一个项目。 这是导致问题的类:

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的类,它使用一个函数fetch()从文件服务器获取一个FSFile作为回报。fetch()函数没有什么特别之处,它只是创建一个FSFile并返回它。这些类之间的所有通信都是通过RMI进行的


我怎么会有这样的错误?

你不能序列化读写器。这毫无意义。这就像试图通过电话线发送电话一样。如果要发送文件,请发送该文件


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

您无法序列化读卡器和写卡器。这毫无意义。这就像试图通过电话线发送电话一样。如果要发送文件,请发送该文件


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

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

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

所以你建议我发送一个文件而不是我的自定义类?我想做的是从一端开始,只需对FSFile调用一个读或写操作,该操作将在另一端本地执行。我想对writeObject和readObject做的只是保持它的状态。事实上,远程用户不能使用类文件进行写入或读取。不,我不建议发送文件。那只是一个名字。我说的是发送内容。如果您想实现某种具有I/O功能的远程文件,那就另当别论了,您必须实现自己的RemoteOutputStream等。这不是设计系统IMO的一种简单、可行的方法,也不是一种很好的方法。因此,您建议我发送一个文件,而不是我的自定义类?我想做的是从一端开始,只需对FSFile调用一个读或写操作,该操作将在另一端本地执行。我想对writeObject和readObject做的只是保持它的状态。事实上,远程用户不能使用类文件进行写入或读取。不,我不建议发送文件。那只是一个名字。我说的是发送内容。如果您想实现某种具有I/O功能的远程文件,那就另当别论了,您必须实现自己的RemoteOutputStream等。这不是设计系统的简单、不可能、也不是很好的方法。