Всем привет Думал, что разобрался в сериализации, но наткнулся на непонятку. Создаю 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}]
Объекты восстановлены
Что происходит? Почему не сохранился (или не прочитался) лист с добавленными юзерами?
Вы по сути добавляете один и тот же объект два раза, и поэтому второй раз объект не записывается, так как он уже существует. Вместо этого я просто создал новый 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 +
'}';
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Может кто-нибудь по шагам показать как возникает spurious wakeup? Те