Nội dung chính
- 1. Serialization trong java
- 2. Deserialization trong java
- 3. Java Serialization với thừa kế (Mối quan hệ IS-A)
- 4. Java Serialization với sự kết hợp (Mối quan hệ HAS-A)
- 5. Java Serialization với thành viên dữ liệu static
- 6. Java Serialization với array hoặc collection
- 7. Externalizable trong java
- 8. Từ khóa transient trong java
1. Serialization trong java
Tuần tự hoá trong java hay serialization trong java là một cơ chế để ghi trạng thái của một đối tượng vào một byte stream.
Nó chủ yếu được sử dụng trong các công nghệ Hibernate, RMI, JPA, EJB và JMS.
Hoạt động ngược lại của serialization được gọi là deserialization.
Ưu điểm của Serialization trong java
Nó chủ yếu được sử dụng để truyền trạng thái của đối tượng qua mạng (được biết đến như marshaling).
java.io.Serializable interface
Serializable là một giao diện đánh dấu (không có thành viên dữ liệu và phương thức). Nó được sử dụng để "đánh dấu" các lớp java để các đối tượng của các lớp này có thể nhận được khả năng nhất định. Cloneable và Remote cũng là những interface đánh dấu.
Nó phải được implements bởi lớp mà đối tượng của nó bạn muốn persist, bạn có thể xem thêm về đối tượng persistent là gì?
Lớp String và tất cả các lớp wrapper implements giao tiếp java.io.Serializable theo mặc định.
Hãy xem ví dụ dưới đây:
import java.io.Serializable; public class Student implements Serializable { int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }
Trong ví dụ trên, lớp Student implements giao tiếp Serializable. Bây giờ các đối tượng của nó có thể được chuyển đổi thành stream.
Tìm hiểu bài học về lớp ObjectOutputStream trong java để hiểu rõ hơn về serialization trong java.
2. Deserialization trong java
Deserialization là quá trình tái thiết lại các đối tượng từ trạng thái serialized.Đây là hoạt động ngược lại của serialization.
Tìm hiểu bài học về lớp ObjectInputStream trong java để hiểu rõ hơn về serialization trong java.
3. Java Serialization với thừa kế (Mối quan hệ IS-A)
Nếu một lớp implements giao tiếp Serializable thì tất cả các lớp con của nó cũng sẽ được serializable. Hãy xem ví dụ dưới đây:
public class Person { int id; String name; Person(int id, String name) { this.id = id; this.name = name; } }
public class Student extends Person { String course; int fee; public Student(int id, String name, String course, int fee) { super(id, name); this.course = course; this.fee = fee; } }
Các bạn hãy thực hành ghi và đọc với lớp ObjectOutputStream trong java và lớp ObjectInputStream trong java về Java Serialization với thừa kế nhé.
4. Java Serialization với sự kết hợp (Mối quan hệ HAS-A)
Nếu một lớp có một tham chiếu của một lớp khác, tất cả các tham chiếu phải được implements giao tiếp Serializable nếu không quá trình serialization sẽ không được thực hiện. Trong trường hợp đó, NotSerializableException được ném ra khi chạy.
public class Address { String addressLine, city, state; public Address(String addressLine, String city, String state) { this.addressLine = addressLine; this.city = city; this.state = state; } }
import java.io.Serializable; public class Student implements Serializable { int id; String name; Address address;// HAS-A public Student(int id, String name) { this.id = id; this.name = name; } }
Vì Address không implements giao tiếp Serializable nên bạn không thể serialize thể hiện của lớp Student.
Các bạn hãy thực hành ghi và đọc với lớp ObjectOutputStream trong java và lớp ObjectInputStream trong java về Java Serialization với sự kết hợp nhé.
5. Java Serialization với thành viên dữ liệu static
Nếu có bất kỳ thành viên dữ liệu static trong một lớp, nó sẽ không được serialized bởi vì static là một phần của lớp chứ không phải đối tượng.
import java.io.Serializable; public class Employee implements Serializable { int id; String name; static String company = "KienThucLapTrinh";// it won't be serialized public Employee(int id, String name) { this.id = id; this.name = name; } }
6. Java Serialization với array hoặc collection
Quy tắc: Trong trường hợp mảng hoặc bộ sưu tập, tất cả các đối tượng củaarray hoặc collection phải được tuần tự hóa. Nếu bất kỳ đối tượng không phải là serialiizable, serialization sẽ không thành công.
7. Externalizable trong java
Giao tiếp Externalizable cung cấp khả năng viết trạng thái của một đối tượng vào một byte stream ở định dạng nén. Nó không phải là một giao diện đánh dấu.
Giao tiếp Externalizable cung cấp hai phương thức:
- public void writeExternal(ObjectOutput out) throws IOException
- public void readExternal(ObjectInput in) throws IOException
8. Từ khóa transient trong java
Nếu bạn không muốn serialize bất kỳ thành viên dữ liệu của một lớp học, bạn có thể đánh dấu nó với từ khóa transient
Xem bài học tiếp theo để biết thêm chi tiết.