Сериализация Java с RMI - PullRequest
       3

Сериализация Java с RMI

1 голос
/ 05 декабря 2010

Я работаю над проектом с использованием 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, который использует функцию fetch () из FileServer, чтобы получить взамен FSFile.В функции fetch () нет ничего особенного, она просто создает FSFile и возвращает его.Все коммуникации между этими классами осуществляются через RMI.

Почему у меня такая ошибка?

Ответы [ 2 ]

3 голосов
/ 05 декабря 2010

Если вы не хотите повторно реализовывать отправку файлов / потоков через RMI, вы можете посмотреть RMIIO , он обрабатывает такие вещи кратко и эффективно.

3 голосов
/ 05 декабря 2010

Вы не можете сериализовать читателей и писателей. Это не имеет никакого смысла. Это все равно что пытаться отправить телефон по телефонной линии. Если вы хотите отправить файл, отправьте файл.

И ваш код просто вызывает writeObject для этих объектов, как если бы они были сериализуемыми. Это не так. В противном случае вы могли бы сделать их непереходными и вообще исключить пользовательские методы readObject и writeObject. Просто перекодирование того, что система сделала бы в любом случае, ничего не меняет. Это, конечно, не делает классы Serializable такими, какие нет.

...