【问题标题】:Java: Transferable Objects & SerializationJava:可转移对象和序列化
【发布时间】:2011-11-21 22:22:33
【问题描述】:

我需要序列化一个 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();

【问题讨论】:

  • 如果你尝试实现 Serializable 接口?还是您确定此对象中的任何字段都是可序列化的?没有代码,很难帮你:(
  • 类实现可序列化
  • 看来contents对象是可转移的,但不可序列化

标签: java serialization stream data-transfer-objects


【解决方案1】:

您的对象似乎必须同时实现 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;
    }
}

【讨论】:

  • 没错!就我而言,我只是用 Serializable 实现了我的对象,它解决了这个问题。
【解决方案2】:

解决这个问题的最佳方法是将每个数据风格解析为可序列化的对象,即将字符串剪贴板内容放入字符串对象

【讨论】:

    【解决方案3】:

    您的具体类必须实现Serializable 接口才能这样做。

    【讨论】:

      【解决方案4】:
       * 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。 还要检查所有字段是否也是可序列化的。如果不是 - 将它们标记为瞬态。

      【讨论】:

      • 我写的 public class NameofClass implements Serializable 够了吗?
      • 我需要通过对象数据流发送不可序列化的字段,如果我使对象瞬态,这可能吗?
      • transient 表示该字段不会被序列化。如果您需要发送此对象,您有以下选项: * 使此对象可序列化 * 如果您无法访问它,则创建您自己的可序列化类,该类将从所需的源复制所有需要的数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      相关资源
      最近更新 更多