Java là một ngôn ngữ lập trình mạnh mẽ, cho phép người dùng tạo ra các đối tượng có khả năng tái sử dụng trong bộ nhớ. Tuy nhiên, nếu bạn mong muốn tạo ra một đối tượng có thể tồn tại ngoài vòng đời của Java Virtual Machine (JVM) thì Serializable trong Java sẽ là giải pháp tối ưu cho nhu cầu của bạn. Hãy cùng Wiki Lanit khám phá về Serializable trong Java để hiểu rõ hơn về giải pháp này nhé!
Serializable trong Java là gì?
Serializable trong Java, hay còn được gọi là tuần tự hóa trong Java, là một cơ chế giúp việc lưu trữ và chuyển đổi trạng thái của một đối tượng (Object) thành một byte stream, sao cho byte stream này có thể chuyển đổi ngược trở thành một Object.
Quá trình chuyển đổi byte stream thành Object được gọi là DeSerialization. Để một Object có thể thực hiện Serialization, hay Serializable, class của Object buộc phải implements interface java.io.Serializable.
Chú ý:
- Interface: có nghĩa là giao diện
- Class: có nghĩa là lớp
- Object: có nghĩa là đối tượng
- Fields: có nghĩa là trường
- Implement: có nghĩa là các class kế thừa từ Interface.
Interface java.io.Serializable
Nếu nói về Serializable trong Java thì không thể thiếu Interface java.io.Serializable. Serializable là một Interface (giao diện) không chứa dữ liệu hoặc phương thức. Thông thường, Serializable được áp dụng để đánh dấu các lớp (class) trong Java, cho phép các Object trong lớp đó có khả năng kế thừa các tính năng nhất định.
Ví dụ: lớp LANIT implements interface java.io.Serializable. Điều này giúp các Object bên trong lớp LANIT có thể được chuyển đổi thành dạng stream.
import java.io.Serializable; public class LANIT implements Serializable { int id; String name; public LANIT(int id, String name) { this.id = id; this.name = name; } }
Vì sao nên sử dụng Serializable trong Java?
Trong lập trình Java, khi chúng ta thực hiện việc trao đổi dữ liệu giữa các module khác nhau được viết bằng Java, dữ liệu thường được biểu diễn dưới dạng byte thay vì Object. Do đó, để có thể hiểu được và xử lý dữ liệu được truyền đi /nhận về, chúng ta cần một cơ chế phù hợp. Serializable trong Java chính là cơ chế đảm nhận nhiệm vụ chuyển đổi này.
Quá trình Serialization Trong Java thực hiện việc chuyển đổi giữa Object và byte stream giữa các module mà không phụ thuộc vào nền tảng nào, đảm bảo tính độc lập trong vận hành.
Cần lưu ý gì về Serializable trong Java?
Dưới đây là một số lưu ý bạn cần chú ý về Serializable trong Java:
- Nếu một class mẹ đã thực hiện việc implement Serializable, thì class con không cần phải thực hiện lại việc implement Serializable.
- Ngoại trừ thuộc tính transient, thuộc tính static cũng không thể được Serialization.
- Hàm constructor, hay hàm khởi tạo, sẽ không được gọi khi một Object được thực hiện DeSerialization.
- Để có khả năng Serializable cho một Object, tất cả các thuộc tính bên trong Object đó đều cần phải được Serializable. Ví dụ, nếu thuộc tính DiaChi của Object NhanVien không implement Serializable, khi thực hiện Serialization cho Object NhanVien, Java sẽ thông báo lỗi java.io.NotSerializableException.
Sau đây hãy cùng Wiki Lanit đến với một số ví dụ về Serializable trong Java.
Serializing một Object
Sau khi bạn đã nắm sơ lược Serialization trong Java là gì cũng như những đặc điểm liên quan, hãy cùng tìm hiểu sâu hơn về cách serializing một object.
Ví dụ:
import java.io.*; public class SerializeDemo { public static void main(String [] args) { NhanVien e = new NhanVien(); e.name = "Jame Bond"; e.address = "Ho Chi Minh, Viet Nam"; e.CMND = 11122333; e.number = 113; try { FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Dữ liệu sau serialized được lưu tại /tmp/employee.ser"); } catch (IOException i) { i.printStackTrace(); } } }
Ở đây, ta có thể nhận xét như sau:
- Class ObjectOutputStream được sử dụng để thực hiện việc tuần tự hóa (serialize) một Object. Trong chương trình SerializeDemo, Object NhanVien được khởi tạo và sau đó được tuần tự hoá thành một tệp.
- Sau khi chương trình SerializeDemo thực hiện, một tệp có tên là worker.ser sẽ được tạo ra.
Trong ngôn ngữ lập trình Java, quy ước chung là khi một Object được tạo ra và tuần tự hoá, tên của tệp tương ứng sẽ có phần mở rộng là .ser.
Java Serialization với Inheritance (Mối quan hệ IS-A)
Nếu một class thực hiện (implements) giao diện Serializable, thì tất cả các class con của nó cũng sẽ có khả năng tuần tự hóa (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; } }
Hãy thực hành việc ghi và đọc lớp ObjectOutputStream trong Java và lớp ObjectInputStream trong Java về Java Serialization với việc kế thừa (Inheritance).
Java Serialization với Aggregation (Mối quan hệ Has-A)
Nếu một class chứa một tham chiếu của một class khác, thì tất cả các tham chiếu đó phải implements giao diện Serializable; nếu không, quá trình serialization sẽ không thể thực hiện. Trong tình huống này, khi chạy chương trình một NotSerializableException sẽ được ném ra.
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ì lớp Address không thực hiện (implements) giao diện Serializable, do đó, bạn không thể tuần tự hóa (serialize) lớp Student.
Serialization Trong Java với thành viên Static data
Nếu lớp có bất kỳ thành viên dữ liệu static nào, nó sẽ không được tuần tự hóa (serialized), vì thành viên dữ liệu static là một phần của lớp chứ không phải của đối tượng.
import java.io.Serializable; public class Employee implements Serializable { int id; String name; static String company = "VietTuts";// it won't be serialized public Employee(int id, String name) { this.id = id; this.name = name; } }
FAQs về Serializable trong Java
Có thể tìm hiểu thêm kiến thức về Serializable trong Java ở đâu?
Để khám phá thêm về Serializable trong Java, bạn có thể tìm kiếm tài liệu chính thức của Oracle trên JavaWorld và Javase 7. Đối với tài liệu chính thức từ Oracle, cần có kiến thức chuyên sâu và từ vựng tiếng Anh chuyên ngành công nghệ thông tin để hiểu rõ. Mặc dù bạn có thể sử dụng Google dịch, nhưng nên lưu ý rằng nội dung dịch máy có thể khá khó hiểu.
Tìm học Java trực tuyến ở đâu?
Học Java Online rất dễ dàng, bạn chỉ chuẩn bị thiết bị có kết nối Internet và tinh thần kiên trì thì bất kể ngôn ngữ nào cũng có thể học thành thạo. Một số trang website cung cấp khóa học Java phổ biến có thể kể đến như là TutorialsPoint, Oracle hoặc W3Schools,…
Kết luận
Qua bài viết, Wiki Lanit hy vọng các bạn đã có cái nhìn tổng quan Serializable trong Java. Mong rằng những kiến thức này sẽ giúp ích các bạn thật nhiều trong lập trình và trở thành nhà phát triển thành công. Đừng quên theo dõi các bài viết thú vị khác từ Wiki Lanit nhé!
Comments are closed.