序列化可运行对象

时间:2015-09-03 08:29:20

标签: java serialization runnable

是否可以在java6中序列化可运行对象? 我想将runnable对象存储到文件中。

如果没有,还有其他方法可以达到这个目的吗?

我有这堂课:

public abstract class SerializableRunnable implements Serializable, Runnable
{

    private static final long serialVersionUID = 6217172014399079306L;

    @Override
    public abstract void run();

}

然后我有另一个容器,前一个容器:

public class Action implements Serializable
{
    ...
    private SerializableRunnable m_runnable;

    @Override
    public void Write(DataOutputStream dout) throws IOException
    {
        ...
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(m_runnable);
        oos.close();

        byte[] m_runnableBytes = baos.toByteArray();
        dout.writeInt(m_runnableBytes.length);
        dout.write(m_runnableBytes);
    }
...
}

问题是我在这行代码中得到了 java.io.NotSerializableException

oos.writeObject(m_runnable);

堆栈追踪:

java.io.NotSerializableException:
  [r]   at java.io.ObjectOutputStream.writeObject0(Unknown Source)
  [r]   at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
  [r]   at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
  [r]   at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
  [r]   at java.io.ObjectOutputStream.writeObject0(Unknown Source)
  [r]   at java.io.ObjectOutputStream.writeObject(Unknown Source)
  [r]   at mypackage.Action.Write(Action.java:52)

可运行创建:

EventManager.addAction(new Action(false, EventManager.ON_EVENT_X, 
    new SerializableRunnable()
    {
         @Override
         public void run()
         {
             // Do whatever
         }
    }));

提前致谢

编辑:添加示例代码
EDIT2:添加了堆栈跟踪
EDIT3:添加了可运行的创建

1 个答案:

答案 0 :(得分:3)

感谢大家的评论。

这个问题与@KDM所说的有关。该类不是真正的SerializableRunnable,而是一个匿名类,因此封闭类也必须是可序列化的。