2015-09-03 4 views
3

Возможно ли сериализовать исполняемый объект в java6? Я хочу сохранить запущенный объект в файл.Сериализовать выполняемый объект

Если нет, есть ли другой способ достичь этого?

У меня есть этот класс:

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); 

Stack trace:

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) 

Runnable создание:

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

Заранее спасибо

EDIT: добавлены примеры код
EDIT2: добавлена ​​стек трассировка
EDIT3: добавлена ​​работоспособное создание

+4

Да, вы можете. Убедитесь, что ваш класс реализует как Runnable, так и Serializable. Вы можете сохранить объект в файл с помощью ObjectOutputStream и восстановить с помощью ObjectInputStream. Но я бы сохранил объект, который содержит какое-то состояние или информацию. –

+0

Что должно удержать вас от сериализации любого объекта? – JimmyB

+0

В зависимости от _why_ вы хотите сохранить объект, может быть проще написать 'class', чтобы хранить только данные и сериализовать их. Затем сделайте свой «Runnable» использовать этот класс данных. –

ответ

3

Спасибо всем за ваши комментарии.

Вопрос был связан с тем, что сказал @KDM. Класс не был действительно SerializableRunnable, но анонимным классом, и поэтому охватывающий класс также должен быть сериализуемым.