× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Serialization trong Java - Khái niệm không thể bỏ qua trong Java

06/05/2021 02:05

Trong bài viết hôm nay, chúng ta sẽ tìm hiểu về quá trình Serialization trong Java và những ưu điểm và nhược điểm của Serialization.

Serialization và Deserialization trong Java

Serialization là khái niệm giúp chúng ta chuyển đổi đối tượng thành dạng mảng byte và chúng ta sẽ gửi mảng byte đó đến máy chủ mà chúng ta sẽ lại chuyển đổi nó thành đối tượng. Về cơ bản, quá trình chuyển đổi đối tượng thành luồng byte được gọi là Serialization, chúng ta tuần tự hóa đối tượng vào mảng byte. Khi chúng ta chuyển đổi luồng byte trở lại đối tượng thì chúng ta gọi nó là Deserialization - luồng byte được giải mã cho đối tượng.

Serialization và Deserialization trong Java

Serialization và Deserialization trong Java

Khái niệm về Serialization trong Java

Serialization trong Java là quá trình ghi lại trạng thái của đối tượng trong luồng byte vì luồng byte độc lập với nền tảng. Nên chúng ta có thể tận dụng ưu điểm này bằng cách tuần tự hóa một đối tượng trên một nền tảng và sử dụng luồng byte trong những nền tảng khác nhau. Để tuần tự hóa một đối tượng, chúng ta cần thực hiện giao diện java.io.Serialization.

Khái niệm về Serialization trong Java

Khái niệm về Serialization trong Java

Kỹ thuật của Serialization  trong Java thường được sử dụng chủ yếu trong công nghệ như RMI, EJB, JPA và Hibernate,...Để tuần tự một đối tượng trong luồng byte, chúng ta cần gọi phương thức writeObject của lớp ObjectOutputStream. 

>>> Tham khảo: Khóa học lập trình Java

Giao diện java.io.Serializable

java.io.Serializable là một giao diện đánh dấu có thể bổ sung hành vi có thể nối tiếp vào một lớp triển khai nó.

Lớp ObjectOutputStream

Lớp ObjectOutputStream là một luồng cấp cao chứa các phương thức tuần tự hóa cho các đối tượng trong luồng byte. Lớp ObjectOutputStream viết các đối tượng và kiểu dữ liệu nguyên thủy  đến OutputStream. Quy tắc là chúng ta chỉ có thể viết đối tượng đó tới những luồng hỗ trợ giao diện java.io.Serializable.

Hàm tạo của lớp ObjectOutputStream

Chúng ta sử dụng hàm tạo của lớp ObjectOutputStream  theo cú pháp như sau:

public ObjectOutputStream(OutputStream output) throws IOException 

{

      //code

}

 

Các phương thức quan trọng của lớp ObjectOutputStream

Có một số phương thức quan trọng trong lớp ObjectOutputStream giúp chúng ta tuần tự hóa một đối tượng. Những phương thức được liệt kê trong bảng dưới đây:

 

STT

Phương thức

Mô tả

1

public final void writeObject (Object obj) ném IOException {}

Phương thức này ghi đối tượng được chỉ định vào lớp ObjectOutputStream

2

public void flush () ném IOException {}

Phương thức này xóa đối tượng dòng đầu ra hiện tại.

3

public void close () ném IOException {}

Phương thức này đóng đối tượng luồng đầu ra hiện tại.

 

>>>Đọc thêm:  Mảng trong Java. Tìm hiểu về mang cho người mới bắt đầu

Ví dụ về Serialization trong Java

Để hiểu hoạt động của Serialization trong Java, trước tiên chúng ta sẽ tạo một lớp triển khai giao diện Serializable. Ví dụ dưới đây, chúng ta sẽ tạo một lớp mang tên Teacher. Lớp này thực thi giao diện java.io.Serializable và có 2 thành viên và một hàm tạo:

 

package com.techvidvan.serialization;

import java.io.Serializable;  

public class Teacher implements Serializable

{  

int id;  

   String name;  

   public Teacher(int id, String name)

{  

      this.id = id;  

      this.name = name;  

}  

} 

 

Sau việc này, chúng ta sẽ tuần tự hóa đối tượng của lớp Teacher. Để hoàn thành việc này, chúng ta sẽ viết phương thức writeObject() của lớp ObjectOutputStream mà được sử dụng để tuần tự hóa đối tượng trong luồng byte. Chúng ta sẽ lưu trữ tình trạng của đối tượng trong một file văn bản là myFile.txt.

package com.techvidvan.serialization;

import java.io.*;  

public class Serialization

{  

   public static void main(String args[])

{  

     try

{  

        //Creating the object  of Teacher class

        Teacher t1 = new Teacher(101," John");  




        //Creating the byte stream and writing the object into a file 

        FileOutputStream file = new FileOutputStream("myFile.txt");  




        ObjectOutputStream output = new ObjectOutputStream(file);  

        output.writeObject(t1);  

        output.flush();  

        

//closing the stream  

        output.close();  

System.out.println("Successfully created a byte stream and written it in the specified file");  

      }

catch(Exception e)

{

System.out.println(e);  

     } 

} 

}  

Output 

Thành công tạo luồng byte và viết nó trong tệp được chỉ định.

Deserialization trong Java

Đây  là quá trình đảo ngược của Serialization mà có thể chuyển đổi luồng byte lại trạng thái của đối tượng. Phương thức được sử dụng để  deserialize một luồng byte thành một đối tượng là phương thức readObject() của lớp ObjectInputStream.

Lớp ObjectInputStream

Khái niệm ObjectInputStream

ObjectInputStream là một lớp luồng cấp cao có chứa các phương thức giúp chúng ta giải mã luồng byte trở lại trạng thái của đối tượng. Nó giải mã hóa các đối tượng và dữ liệu nguyên thủy được viết bằng ObjectOutputStream.

 Hàm tạo của lớp ObjectInputStream

Chúng ta sử dụng phương thức khởi tạo của lớp ObjectOutputStream có cú pháp sau:

public ObjectInputStream(InputStream in) throws IOException 

{

  //code

}

Các phương thức quan trọng của lớp ObjectInputStream

Có một số phương thức quan trọng trong lớp ObjectInputStream giúp chúng ta giải mã hóa một đối tượng. Các phương pháp này được liệt kê trong bảng sau:

STT

Phương thức

Mô tả

1

public final Object readObject () throws  IOException, ClassNotFoundException {}

Phương thức này đọc một đối tượng từ luồng đầu vào

2

public void close () throws IOException {

Phương thức này được sử dụng để đóng đối tượng của ObjectInputStream

>>> Đọc thêm: String trong Java - Tìm hiểu về chuỗi và các phương thức chuỗi trong Java

Ví dụ của Deserialization

Giờ là lúc chúng ta chuyển đổi luồng byte mà chúng ta tạo ra trong chương trình trước đó thành đối tượng.

Đoạn mã để giải mã hóa đối tượng:

package com.techvidvan.deserialization;

import java.io.*;  

public class Deserialization

{  

     public static void main(String args[])

     {

      try

                {  

        //Creating stream to read the object  

                        ObjectInputStream input = new ObjectInputStream(new FileInputStream("myFile.txt"));  

       Teacher teacher = (Teacher)input.readObject();  

       

                        //printing the data of the serialized object  

        System.out.println(“The id of the teacher is:” +teacher.id);  

                        System.out.println(“The name of the teacher is:” +teacher.name); 

        

                        //closing the stream  

        input.close();  

      }

                catch(Exception e)

                {

                        System.out.println(e);

                }  

      }  

 

Output

The id of the teacher  là:101

The name of the teacher is: John

Serialization trong java với kế thừa (Mối quan hệ IS -A)

Nếu lớp cha triển khai giao diện Serializable, thì tất cả các lớp con của nó cũng sẽ tự động Serializable. Để hiểu khái niệm này, bạn có thể xem ví dụ sau:

 

Lớp cha:

package com.techvidvan.serialization;

import java.io.Serializable;  

class Employee implements Serializable

{  

      int id;  

      String name;  

      Employee(int id, String name) 

      {  

           this.id = id;  

           this.name = name;  

      }  

}

Lớp con:

package com.techvidvan.serialization;

class Teacher extends Employee

{  

     String subjectName;  

     double salary;  

     public Teacher(int id, String name, String subjectName, double salary) 

     {  

                super(id,name);  

      this.subjectName= subjectName;

     this.salary = salary;;  

     }  

} 

Ưu điểm của Serialization trong Java

  • Để lưu/ duy trì trạng thái của một đối tượng.
  • Để di chuyển một đối tượng qua mạng.

Kết luận:

Serialization trong Java và Deserialization là một khái niệm vô cùng quan trọng. Những khái niệm này sẽ hỗ trợ bạn trên hành trình trở thành lập trình viên Java. Bài viết này đã giới thiệu tới bạn về Serialization, hy vọng bạn có thể nắm rõ về Serialization trong Java. Đừng quên theo dõi các bài viết của T3H và tham khảo các khóa học lập trình tại Viện công nghệ thông tin T3H bạn nhé!