Serialization Java

174
04 декабря 2017, 16:51

Всем привет Думал, что разобрался в сериализации, но наткнулся на непонятку. Создаю LinkedList< User >. Само собой, класс User implements Serializable. Добавляю в лист 2 юзера. Пишу весь лист в ObjectOutputStream. Потом добавляю в лист еще 5 юзеров. Снова сериализую. Дулаю flush(), все закрывается (Autocloseable). Десериализация. читаю первый объект (ожидаю считать из файла LinkedList с 2 юзерами - так и есть. Ок. Читаю второй объект (ожидаю увидеть другой LinkedList уже с добавленными 5 юзерами). Но вижу тот же лист с 2 юзерами, что и при первом чтении.

User:

public class User implements Serializable {
private String name;
private int age;
public User(String name, int age) {
    this.name = name;
    this.age = age;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
@Override
public String toString() {
    return "User{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
}
}

Main:

    List<User> userLinkedList = new LinkedList<>();
    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("User.ser"))) {
        userLinkedList.add(new User("Женя", 42));
        userLinkedList.add(new User("Александр", 21));
        // write whole Lists
        oos.writeObject(userLinkedList); // LinkedList
        // Add some data
        userLinkedList.add(new User("+ Александр", 21));
        userLinkedList.add(new User("+ Маша", 11));
        userLinkedList.add(new User("+ Саша", 24));
        userLinkedList.add(new User("+ Олег", 25));
        userLinkedList.add(new User("+ Оля", 27));
        System.out.println(userLinkedList);
        // now LinkedList contains 2 + 5 = 7 elements
        oos.writeObject(userLinkedList); // LinkedList
        oos.flush();
        System.out.println("Объекты сохранены");
    } catch (FileNotFoundException fNFex) {
        System.out.println(fNFex);
    }
    System.out.println("Читаем объекты...");
    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("User.ser"))) {
        // read whole Lists
        List<User> u2in;
        u2in = (List) ois.readObject(); // LinkedList
        System.out.println(u2in);
        List<User> u3in;
        u3in = (List) ois.readObject(); // LinkedList with added elements
        System.out.println(u3in);
        System.out.println("Объекты восстановлены");
    } catch (FileNotFoundException fNFex) {
        System.out.println("FNF Error!");
    } catch (ClassNotFoundException cNFex) {
        System.out.println("CNF Error!");
    }
Output:
[User{name='Женя', age=42}, User{name='Александр', age=21}, User{name='+ Александр', age=21}, User{name='+ Маша', age=11}, User{name='+ Саша', age=24}, User{name='+ Олег', age=25}, User{name='+ Оля', age=27}]
Объекты сохранены
Читаем объекты...
null
[User{name='Женя', age=42}, User{name='Александр', age=21}]
[User{name='Женя', age=42}, User{name='Александр', age=21}]
Объекты восстановлены

Что происходит? Почему не сохранился (или не прочитался) лист с добавленными юзерами?

Answer 1

Вы по сути добавляете один и тот же объект два раза, и поэтому второй раз объект не записывается, так как он уже существует. Вместо этого я просто создал новый LinkedList скопировав старый и все заработало.

package ser;
import java.io.*;
import java.util.LinkedList;
import java.util.List;
public class User implements Serializable {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public static void main(String[] args) {
        List<User> userLinkedList = new LinkedList<>();
        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("User.ser"))) {
            userLinkedList.add(new User("Женя", 42));
            userLinkedList.add(new User("Александр", 21));
            // write whole Lists
            oos.writeObject(userLinkedList); // LinkedList
            // Add some data
            userLinkedList.add(new User("+ Александр", 21));
            userLinkedList.add(new User("+ Маша", 11));
            userLinkedList.add(new User("+ Саша", 24));
            userLinkedList.add(new User("+ Олег", 25));
            userLinkedList.add(new User("+ Оля", 27));
            System.out.println(userLinkedList);
            // now LinkedList contains 2 + 5 = 7 elements
            oos.writeObject(new LinkedList<>(userLinkedList)); // LinkedList
            oos.flush();
            System.out.println("Объекты сохранены");
        } catch (FileNotFoundException fNFex) {
            System.out.println(fNFex);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Читаем объекты...");
        try (ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("User.ser"))) {
            // read whole Lists
            List<User> u2in;
            u2in = (List) ois.readObject(); // LinkedList
            System.out.println(u2in);
            List<User> u3in;
            u3in = (List) ois.readObject(); // LinkedList with added elements
            System.out.println(u3in);
            System.out.println("Объекты восстановлены");
        } catch (FileNotFoundException fNFex) {
            System.out.println("FNF Error!");
        } catch (ClassNotFoundException cNFex) {
            System.out.println("CNF Error!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
READ ALSO
Вывод в jTextArea из другого класса

Вывод в jTextArea из другого класса

Доброго времени сутокЕсть два класса

169
Покажите как возникает spurious wakeup

Покажите как возникает spurious wakeup

Может кто-нибудь по шагам показать как возникает spurious wakeup? Те

155