package com.javarush.test.level20.lesson07.task05;

import java.io.*;

/* Переопределение сериализации
Сделайте так, чтобы после десериализации нить runner продолжила работать.
Ключевые слова объекта runner менять нельзя.
Hint/Подсказка:
Конструктор не вызывается при сериализации, только инициализируются все поля.
*/
public class Solution implements Serializable, Runnable {
    transient private Thread runner;
    private int speed;

    public Solution(int speed) {
        this.speed = speed;
        startThread();
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Solution savedObject = new Solution(1000);
        Thread.sleep(5000);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("20-07-05.txt"));
        oos.writeObject(savedObject);
        oos.flush();
        oos.close();

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("20-07-05.txt"));
        Solution loadedObject = (Solution) ois.readObject();
        System.out.println(loadedObject.speed);
    }

    public void run() {
        // do something here, does not matter
        while (true) {
            System.out.println("he-he ");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     Переопределяем сериализацию.
     Для этого необходимо объявить методы:
     private void writeObject(ObjectOutputStream out) throws IOException
     private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
     Теперь сериализация/десериализация пойдет по нашему сценарию 🙂
     */
    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        startThread();
    }

    private void startThread() {
        runner = new Thread(this);
        runner.start();
    }
}