序列化一个可运行对象
Serialize a runnable object
是否可以在 java6 中序列化可运行对象?
我想将可运行对象存储到文件中。
如果不行,有没有其他方法可以实现?
我有这个class:
public abstract class SerializableRunnable implements Serializable, Runnable
{
private static final long serialVersionUID = 6217172014399079306L;
@Override
public abstract void run();
}
然后我还有另一个 class 那个容器:
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:添加了可运行的创建
感谢大家的评论。
这个问题与@KDM 所说的有关。 class 并不是真正的 SerializableRunnable,而是一个匿名的 class,因此封闭的 class 也必须是可序列化的。
是否可以在 java6 中序列化可运行对象? 我想将可运行对象存储到文件中。
如果不行,有没有其他方法可以实现?
我有这个class:
public abstract class SerializableRunnable implements Serializable, Runnable
{
private static final long serialVersionUID = 6217172014399079306L;
@Override
public abstract void run();
}
然后我还有另一个 class 那个容器:
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:添加了可运行的创建
感谢大家的评论。
这个问题与@KDM 所说的有关。 class 并不是真正的 SerializableRunnable,而是一个匿名的 class,因此封闭的 class 也必须是可序列化的。