Java: переносимые объекты и сериализация - PullRequest
1 голос
/ 21 сентября 2011

Мне нужно сериализовать объект Transferable, чтобы я мог отправить его через поток данных объекта, но во время выполнения я получаю сообщение об ошибке java.io.NotSerializableException, и я понятия не имею, что не так.Как это исправить?

Вот часть кода, которая вызывает ошибку

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    Transferable contents = clipboard.getContents(null);
    System.out.println(contents);

    //Initialiaze ObjectStreams
    FileOutputStream fos = new FileOutputStream("t.tmp");
    ObjectOutputStream oos = new ObjectOutputStream(fos);

    //write objects
    oos.writeObject(contents);
    oos.close();

Ответы [ 4 ]

1 голос
/ 20 октября 2011

Лучший способ обойти это - проанализировать каждый фрагмент данных в сериализуемый объект такого рода, т.е. поместить содержимое буфера обмена строки в строковый объект

1 голос
/ 21 сентября 2011
 * Thrown when an instance is required to have a Serializable interface.
 * The serialization runtime or the class of the instance can throw
 * this exception. The argument should be the name of the class.

Хмм.Вы добавили в свой объект implements Serializable?

UPD.Также убедитесь, что все поля также сериализуемы.Если нет - пометьте их как временные.

1 голос
/ 21 сентября 2011

Кажется, что ваш объект должен реализовывать как Transferable, так и Serializable.

Надеюсь, этот код поможет вам

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//Initialiaze ObjectStreams
FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);

clipboard.setContents(new Plop(), null);
final Transferable contents = clipboard.getContents(null);
final Plop transferData = (Plop) contents.getTransferData(new DataFlavor(Plop.class, null));
oos.writeObject(transferData);
oos.close();

с таким шлепком, как:

static class Plop implements Transferable, Serializable{

    @Override
    public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[0];  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public boolean isDataFlavorSupported(final DataFlavor flavor) {
        return false;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public Object getTransferData(final DataFlavor flavor) throws UnsupportedFlavorException, IOException {
        return this;
    }
}
1 голос
/ 21 сентября 2011

Ваш конкретный класс должен реализовывать интерфейс Serializable, чтобы сделать это.

...