2016-01-01 2 views
0

В настоящее время я использую встроенный сериализатор JAVA java.io.Serializable и, похоже, не может его десериализовать и установить для моих полей значения по умолчанию. Я даже попытался использовать readObject для инициализации полей, но он просто не работает.Переходные поля становятся нулевыми после десериализации?

Вот мой код:

public abstract class BossQuest implements Quest, 
      Listenable { //Quest(interface) extends Serializable 

private transient Status status = Status.IDLE; //This does not work 

private String name; 

public BossQuest(String name) { 
    this.name = name; 
    initialize(); 
} 

//This also does not work 
public BossQuest() { 
    this.status = Status.IDLE; 
} 

//This was my hacky attempt to forcefully set default values (Does not work) 
public void initialize() { 
    status = Status.IDLE; 
} 

private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { 
    ois.defaultReadObject(); 
    initialize(); 
} 

public Status getStatus() { 
    System.out.print("Requesting status!"); 

    if (status == null) { 
     System.out.print("Status is.. null..?"); 
    } 

    System.out.print(status); 

    return status; 
} 
} 

В моем коде выше, Quest расширяет Сериализуемый

статус только время является нулевым после я десериализации файла. Он НЕ МОЖЕТ быть установлен на нуль через любой из мутаторов.

+0

Пожалуйста, объясните. Если вы хотите, чтобы он был сериализован, почему вы отмечаете его как «переходный»? – EJP

+0

Класс содержит много данных, а затем только то, что я предоставил, чтобы сделать его более чистым. Одно из моих значений переходного процесса (состояние) не имеет причины для сохранения, потому что оно должно быть установлено на IDLE при создании объекта. – asd7l

ответ

1

Просто используйте readResolve(), чтобы инициализировать статус IDLE.

Вот полный пример:

public class BossQuest implements Serializable { 
    private String name; 
    private transient int status = 42; 

    public BossQuest(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public int getStatus() { 
     return status; 
    } 

    public void setStatus(int status) { 
     this.status = status; 
    } 

    private Object readResolve() { 
     this.status = 42; 
     return this; 
    } 

    public static void main(String[] args) throws IOException, ClassNotFoundException { 
     BossQuest in = new BossQuest("test"); 
     in.setStatus(987); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(in); 
     oos.close(); 

     byte[] b = baos.toByteArray(); 

     ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(b)); 
     BossQuest out = (BossQuest) ois.readObject(); 
     System.out.println(out.getName()); // prints test 
     System.out.println(out.getStatus()); // prints 42 
    } 
} 
+0

Отлично работает! Поскольку мои переходные значения находятся в абстрактных классах, я помещаю защищенные, а не частные. Спасибо за помощь – asd7l

Смежные вопросы