===== Serializacja =====
* **Serializacja** - zamiana obiektu na ciąg bajtów (zapis, przesył sieciowy).
* Klasa musi implementować marker ''java.io.Serializable''.
* Pola ''transient'' są pomijane podczas serializacji.
* ''serialVersionUID'' - wersja klasy, zalecane do deklarowania.
import java.io.*;
class Student implements Serializable {
private static final long serialVersionUID = 1L;
String name;
int grade;
transient String password; // nie będzie serializowane
Student(String name, int grade) { this.name = name; this.grade = grade; }
}
// Zapis (serializacja)
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("student.ser"))) {
oos.writeObject(new Student("Ania", 5));
}
// Odczyt (deserializacja)
try (ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("student.ser"))) {
Student s = (Student) ois.readObject();
System.out.println(s.name + " - " + s.grade);
}
===== Przykłady praktyczne =====
Przetwarzanie listy studentów:
record Student(String name, int grade, String group) {}
List students = List.of(
new Student("Ania", 5, "A"),
new Student("Bartosz", 3, "B"),
new Student("Ola", 4, "A"),
new Student("Adam", 5, "B"),
new Student("Beata", 3, "A")
);
// Najlepsi studenci z grupy A, posortowani alfabetycznie
List topA = students.stream()
.filter(s -> s.group().equals("A") && s.grade() >= 4)
.sorted(Comparator.comparing(Student::name))
.map(Student::name)
.collect(Collectors.toList());
System.out.println(topA); // [Ania, Ola]
// Średnia ocena per grupa
Map avgByGroup = students.stream()
.collect(Collectors.groupingBy(Student::group,
Collectors.averagingInt(Student::grade)));
System.out.println(avgByGroup); // {A=4.0, B=4.0}
// Zapis do pliku
Path out = Path.of("students.txt");
Files.write(out, students.stream()
.map(s -> s.name() + "," + s.grade() + "," + s.group())
.collect(Collectors.toList()));