Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

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 {
/**
* Serial 1 đối tượng xuống file
* @param fileName file chỉ định
* @param h: đối tượng cần serial
* @throws Exception
*/
public void SerialObject(String fileName, Object obj) throws Exception{
//Tạo luồng ghi file
FileOutputStream fs=new FileOutputStream(fileName);
//Tạo luồng để serial đối tượng
ObjectOutputStream os=new ObjectOutputStream(fs);
//chuyển tải đối tượng tới đích (tập tin)
os.writeObject(obj);
//đóng luồng
fs.close();os.close();
}
/**
* Khôi phục(deserial) 1 đối tượng đã được serial trước đó
* lên bộ nhớ.
* @param fileName: file chỉ định
* @return đối tượng đã được phục hồi
* @throws Exception
*/
public Object DeserialObject(String fileName) throws Exception{
Object kp=null;
//Tạo luồng đọc file đã được serial
FileInputStream fi=new FileInputStream(fileName);
//Tạo luồng để Deserialize đối tượng
ObjectInputStream ois=new ObjectInputStream(fi);
//Tiến hành khôi phục đối tượng
kp=ois.readObject();
//đóng luồng
fi.close();ois.close();
return kp;
}
}

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!

12 Responses to “Object Serialization”

  1. 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.

  2. 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 đó.

  3. lh_pucca said

    Em cảm ơn thầy.

  4. 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 ạ

  5. 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.

  6. 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

  7. 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.

  8. 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 ạ?

  9. Cám ơn thầy , bài viết về Serialization khá hay và bổ ích . Free Download

  10. Đặ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.

  11. 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.

  12. 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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: