2011-05-06 28 views
6

Tôi đã trải qua this article để hiểu thêm về quá trình Tuần tự hóa Java. Khi nói đến việc sử dụng của readObject/writeObject Tôi có thể thấy hai trường hợp sử dụng:Sử dụng readObject/writeObject trong Tuần tự hóa

  1. Chúng tôi có thể sử dụng writeObject để mã hóa mã byte trước khi được mã hóa. Từ quan điểm bảo mật, đó là điều tốt.
  2. chúng tôi có thể sử dụng readObject để thực thi bất kỳ đoạn mã cụ thể nào cần thực thi ngay sau khi deserialization, và tắt khóa học từ poin # 1, chúng tôi thậm chí có thể sử dụng readObject để giải mã mã byte đã được giải mã trong khi tuần tự hóa đối tượng.

Có bất kỳ tình huống thực tế nào khác mà bạn gặp phải khi sắp xếp/deserializing đối tượng bằng cách viết phương thức readObject/writeObject tùy chỉnh không? Hoặc Nếu bạn có thể chỉ cho tôi đến bất kỳ nơi mà tôi có thể thấy một số sử dụng phong nha và thiết thực của readObject/writeObject?

+3

Vui lòng cập nhật liên kết đến bài viết. –

Trả lời

11

Tùy chỉnh readObject cũng hữu ích khi bạn cần khởi tạo các trường tạm thời (không được tuần tự hóa) sau khi đối tượng đã được deserialized.


BTW, hãy kiểm tra Effective Java, Chapter 11 (Tôi không biết chắc số chương/mặt hàng trong bản lần 2). Đó là một đọc tuyệt vời về serialization.

+4

'readResolve()' cũng có thể được sử dụng cho mục đích này. – biziclop

+0

Thực ra nó ...Tôi đã tìm kiếm một số ý kiến ​​về chính xác nó đã được sử dụng như thế nào trong ứng dụng của bạn. Mặc dù serialization tùy chỉnh là một điều lạ mắt, nhưng khởi tạo các biến tạm thời hoặc tĩnh trong readObject() thường được sử dụng tính năng. – Vicky

+0

@Vicky: "thực sự nó" như trong, liên kết Java hiệu quả trả lời câu hỏi của bạn? –

4

Có thể có nhiều lý do cho việc sử dụng serialization tùy chỉnh:

  1. Performance.
  2. Giao diện với các hệ thống bên ngoài. (Ngoài tầm với của bạn hoặc thậm chí là các hệ thống không phải Java.)
  3. Cần định dạng có thể đọc được.
  4. Hỗ trợ cho các phiên bản cũ hơn của các lớp được tuần tự hóa.

Để đặt tên chỉ một vài, nhưng tôi chắc chắn có nhiều hơn nữa.

5

Bạn có thể triển khai bạn sở hữu readObject/writeObject vì lý do hiệu suất hoặc lý do tương thích ngược hoặc do trường bạn muốn tuần tự hóa không phải là Serializable.

Để có ví dụ hay về readObject/writeObject, tôi sẽ tìm trong nguồn đi kèm với JDK. Hoặc tôi sẽ thử các phương thức http://www.google.co.uk/search?q=readObject+writeObject+examples

3

Tôi giải mã điều có thể thực hiện tốt hơn bằng cách sử dụng ObjectOutputStream dựa trên CipherOutputsStream.

Việc sử dụng quan trọng nhất của writeObject/readObject là nếu bạn muốn giữ cho Chuỗi tuần tự ổn định qua nhiều lần sửa đổi mã. Biểu diễn bên trong của bạn (biến thành viên) có thể thay đổi nhưng việc tuần tự hóa phải ổn định vì có hệ thống cũ mà bạn giao tiếp với (ví dụ: bằng cách đọc dữ liệu cũ từ tệp).

Nhưng tôi thích giao diện Externalizable cho những trường hợp này vì nó dễ sử dụng hơn (không có cuộc gọi ngầm và phương thức nào mà chỉ có jvm biết).

+0

Đây có phải là lý do tại sao (ví dụ) [triển khai Danh sách LinkedList của Java] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/LinkedList .java # LinkedList.writeObject% 28java.io.ObjectOutputStream% 29) thực hiện các phương thức writeObject/readObject? –

2
public class Employee implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private int empno; 
    private String ename; 
    private String job; 

    // setter & getter 

    @Override 
    public String toString() { 
     return "Employee [empno=" + empno + ", ename=" + ename + ", job=" + job 
       + "]"; 
    } 

    private void writeObject(ObjectOutputStream out) throws IOException { 

     // default serialization 
     // out.defaultWriteObject(); 

     // custom serialization 
     out.writeInt(empno); 
     out.writeUTF(ename); 
     // out.writeUTF(job); //job will not serialize 
    } 

    private void readObject(ObjectInputStream in) throws IOException, 
      ClassNotFoundException { 

     // default deSerialization 
     // in.defaultReadObject(); 

     // custom deSerialization 
     empno = in.readInt(); 
     ename = in.readUTF(); 
     // this.job = in.readUTF(); 
    } 

} 
Các vấn đề liên quan