Object Serialization
Ở bài Các bước căn bản tạo đối tượng trong java, chúng ta đã nói cách tạo 1 danh sách các đối tượng. Ở bài Sử dụng text file để lưu trữ dữ liệu dạng CSDL chúng ta cũng nói về cách dùng TextFile lưu trữ danh sách các đối tượng nhưng cách này không được tốt bởi nó lưu trữ dạng text và việc khôi phục từng dòng text cũng như ký tự phân cách,… làm cho việc này chỉ là ở mức demo cho vui mà thôi. Java có 1 kỹ thuật rất hay dùng để serial 1 đối tượng bất kỳ và gửi xuống tập tin hoặc gửi qua mạng.
Giả sử chúng ta đã có lớp Thisinh.java và lớp Phongthi.java. Bây giờ chúng ta cần chỉnh sửa 1 vài vần đề nữa, cụ thể đó là:
- Đối với các lớp cần serial, chúng ta phải cho lớp đó implements interface java.io.Serialiable.
- Tạo 1 lớp chuyên dùng cho việc serial đối tượng với 2 phương thức SerialObject và DeserialObject.
Code cho lớp Thisinh.java
| public class Thisinh implements java.io.Serializable{ //Các instatance data private String soBD; private String hoTen; private float diemToan; private float diemLy; private float diemHoa;… } |
Code cho lớp Phongthi.java
| public class Phongthi implements java.io.Serializable{ private static final long serialVersionUID = 7576163164455567730L; //các thuộc tính của đối tượng phòng thi private String msPT; private String diachiPT; private int luongTS;… } |
Code cho lớp dùng để serial đối tượng, lớp MyDBengine.java
| package serial;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class MyDBengine { |
Như vậy, với lớp này chúng ta có thể dùng nó cho các lần serial bất kỳ đối tượng nào xuống file.
Chúc các bạn thành công!
lh_pucca said
Thầy ơi em chưa hiểu hàm DeserialObject, mỗi lần lưu một đối tượng xuống file sử dung hàm SerialObject chỉ có thể lưu một đối tượng này vì tạo ra một file mới như vậy không thể lưu nhiều đối tượng được, có phải DeserialObject của thầy khắc phục chổ này không. Em thường lưu xuống một list để dể dàng thêm nhiều đối tượng sau đó lại lưu list này xuông.
DeserialObject hàm này em không biết sử dụng thế nào thầy có thể giải thích và ví dụ rõ hơn chút về hàm này cho em được không, có thể em hiểu ý của thầy, cách này hay thầy chỉ cho em. Em cảm ơn thầy.
Võ Văn Hải said
Em tạo 1 đối tượng, quản lý nó trong danh sách các đối tượng(là 1 đối tượng), các đối tượng lại có quan hệ với nhau,… cứ như thế ta tạo 1 tập các đối tượng và các đối tượng này được chứa trong 1 đối tượng lớn nhất – có thể gọi là database. Như vậy em serialize đối tượng database này xuống đĩa khi hoàn tất công việc. Khi bắt đầu công việc trở lại, bạn phải khôi phục lại cái database thế là xong. Phương thức deserialObject để khôi phục trở lại cái database mà bạn đã lưu trước đó.
lh_pucca said
Em cảm ơn thầy.
Phan Quảng said
Thầy ời cho em hỏi, nếu serial 1 đối tượng thì chỉ serial các thuộc tính thôi hay serial cả các phương thức của đối tượng luôn ạ
Võ Văn Hải said
Phương thức là các tác động lên đối tượng. Khi bạn serialize đối tượng thì chỉ dữ liệu được ghi nhận.
HaGiang said
Phần trên thầy gợi ý cách serialize, deserialize một object(một ThiSinh)
Thầy gợi ý cách làm để serialize nhiều đối tượng PhongThi,mỗi PhongThi chứa nhiều đối tượng ThiSinh của cùng một khối lớp
Võ Văn Hải said
ví dụ phòng thi như sau:
public class PhongThi implements Serializable{ private String mspt; //...các thuộc tính khác nếu có private ArrayList<ThiSInh>lst; //.... }như vậy khi bạn serial class PhongThi thì Thisinh sẽ serial luôn.
Nhớ 1 điều là tất cả các lớp đều phải implements Serializable.
truong vu said
a Hải ơi, nếu trong file mà lưu nhiều đối tượng thì cách đọc lần lượt các đối tượng đó ra như thế nào ạ?
Free Download said
Cám ơn thầy , bài viết về Serialization khá hay và bổ ích . Free Download
Đặng Trung Nguyên said
Thưa thầy.
Vậy nếu ta có một class student(họ tên, ngày sinh, mssv) khi sử dụng kỷ thuật serialization này để ghi dữ liệu ra file thì với 100 student là ta phải ghi ra 100 file khác nhau hay chỉ 1 file có chứa 100 object.
Nếu 1 file có thể chứa 100 object student vậy thì khi đọc file ta làm sao biết đc khi nào hết 100 object đó thưa thầy.
Còn nếu 100 file chứa 100 object student thì làm sao ta có thể quản lý đc 100 file đó thưa thầy.
Võ Văn Hải said
“Thưa thầy.
Vậy nếu ta có một class student(họ tên, ngày sinh, mssv) khi sử dụng kỷ thuật serialization này để ghi dữ liệu ra file thì với 100 student là ta phải ghi ra 100 file khác nhau hay chỉ 1 file có chứa 100 object.
Nếu 1 file có thể chứa 100 object student vậy thì khi đọc file ta làm sao biết đc khi nào hết 100 object đó thưa thầy.
Còn nếu 100 file chứa 100 object student thì làm sao ta có thể quản lý đc 100 file đó thưa thầy.”
Em có 1 cái ArrayList để lưu N student, vậy em chỉ cần serialize cái ArrayList là xong.
Xuân Hào said
Thưa thầy. em làm phương thức lưu file theo cách của thầy và đã lưu thành công nhưng khi em deserial lên lại thì bị lỗi font chữ tùm lum.Mong thầy giúp em