Khi nào chúng ta nên thực hiện giao diện serializable?


153
public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. Khi nào tôi nên thực hiện Serializablegiao diện?
  2. Tại sao chúng ta làm điều đó?
  3. Nó cung cấp cho bất kỳ lợi thế hoặc bảo mật?

1
FYI câu trả lời được chấp nhận ở đây là không đầy đủ và sai lệch, bởi vì nó không giải quyết được những hạn chế về bảo mật. Xem Java hiệu quả , mục 86: Thực hiện tuần tự hóa hết sức thận trọng. Câu trả lời của Raedwald ở đây nói rằng không sử dụng tuần tự hóa là câu trả lời đúng.
Nathan Hughes

Câu trả lời:


157
  1. Từ điều "tuần tự hóa" này là gì? :

    Nó cho phép bạn lấy một đối tượng hoặc một nhóm đối tượng, đặt chúng vào đĩa hoặc gửi chúng thông qua cơ chế vận chuyển dây hoặc không dây, sau đó, có lẽ trên một máy tính khác, đảo ngược quá trình: hồi sinh (các) đối tượng ban đầu. Các cơ chế cơ bản là làm phẳng (các) đối tượng thành một luồng bit một chiều và biến luồng bit đó trở lại (các) đối tượng ban đầu.

    Giống như Transporter trên Star Trek, tất cả chỉ là lấy một thứ gì đó phức tạp và biến nó thành một chuỗi phẳng 1 và 0, sau đó lấy chuỗi 1 và 0 đó (có thể ở một nơi khác, có thể ở một thời điểm khác) và tái tạo lại phức tạp ban đầu " một cái gì đó

    Vì vậy, thực hiện Serializablegiao diện khi bạn cần lưu trữ một bản sao của đối tượng, gửi chúng đến một quy trình khác chạy trên cùng hệ thống hoặc qua mạng.

  2. Bởi vì bạn muốn lưu trữ hoặc gửi một đối tượng.

  3. Nó làm cho việc lưu trữ và gửi các đối tượng dễ dàng. Nó không có gì để làm với an ninh.


4
Đây có phải là cách thực hành tốt nhất để triển khai giao diện seriablizble cho tất cả các mô hình miền ...
theJava

8
@theJava Đây không phải là câu hỏi về thực hành tốt nhất. Đó là một câu hỏi về việc bạn có cần chuỗi byte hay không.
moinudin

5
Khi sử dụng JSON, bạn không phải thực hiện giao diện này và chỉ có thể gửi chuỗi đó .. vì vậy tôi vẫn không chắc tại sao nên sử dụng giao diện này khi bạn có thể sử dụng JSON.
Yonatan Nir

1
@YonatanNir Tôi không chắc tại sao người ta sẽ sử dụng JSON khi MsgPack, Avro, Thrift hoặc Protobuf tốt hơn cho chuyển IO.
OneCricketeer

1
@YonatanNir Một lược đồ được xác định nghiêm ngặt là tốt hơn. Và JSON có nghĩa là có thể đọc được ở người, trong khi các định dạng được mã hóa nhị phân hiệu quả hơn nhiều so với dây
OneCricketeer

48
  1. Triển khai Serializablegiao diện khi bạn muốn có thể chuyển đổi một thể hiện của một lớp thành một chuỗi byte hoặc khi bạn nghĩ rằng một Serializableđối tượng có thể tham chiếu một thể hiện của lớp của bạn.

  2. Serializable các lớp rất hữu ích khi bạn muốn duy trì các thể hiện của chúng hoặc gửi chúng qua một sợi dây.

  3. Thể hiện của Serializablecác lớp học có thể dễ dàng truyền đi. Tuần tự hóa có một số hậu quả bảo mật, tuy nhiên. Đọc Java hiệu quả của Joshua Bloch .


32

Câu trả lời cho câu hỏi này, có lẽ đáng ngạc nhiên, không bao giờ , hoặc thực tế hơn, chỉ khi bạn bị buộc phải có khả năng tương tác với mã kế thừa . Đây là khuyến nghị trong Java hiệu quả, Ấn bản thứ 3 của Joshua Bloch:

Không có lý do để sử dụng tuần tự hóa Java trong bất kỳ hệ thống mới nào bạn viết

Kiến trúc sư trưởng của Oracle, Mark Reinhold, được ghi nhận rằng việc loại bỏ cơ chế tuần tự hóa Java hiện tại là một mục tiêu dài hạn.


Tại sao tuần tự hóa Java là thiếu sót

Java cung cấp như một phần của ngôn ngữ một sơ đồ tuần tự hóa mà bạn có thể chọn tham gia, bằng cách sử dụng Serializablegiao diện. Tuy nhiên, lược đồ này có một số sai sót khó hiểu và nên được coi là một thử nghiệm thất bại của các nhà thiết kế ngôn ngữ Java.

  • Nó cơ bản giả vờ rằng người ta có thể nói về các hình thức tuần tự của một đối tượng. Nhưng có vô số các sơ đồ tuần tự hóa, dẫn đến vô số nhiều dạng nối tiếp. Bằng cách áp đặt một lược đồ, không có cách nào thay đổi lược đồ, các ứng dụng không thể sử dụng lược đồ phù hợp nhất với chúng.
  • Nó được triển khai như một phương tiện bổ sung để xây dựng các đối tượng, bỏ qua mọi điều kiện tiên quyết kiểm tra các nhà xây dựng hoặc phương thức nhà máy của bạn thực hiện. Trừ khi khó khăn, dễ bị lỗi và khó kiểm tra mã giải trừ thêm được viết, mã của bạn có thể có một điểm yếu bảo mật.
  • Kiểm tra khả năng tương tác của các phiên bản khác nhau của hình thức nối tiếp là rất khó khăn.
  • Xử lý các đối tượng bất biến là rắc rối.

Làm gì để thay thế

Thay vào đó, sử dụng sơ đồ tuần tự hóa mà bạn có thể kiểm soát rõ ràng. Chẳng hạn như Bộ đệm giao thức, JSON, XML hoặc lược đồ tùy chỉnh của riêng bạn.


2
không nhiều chuyên gia ở cấp độ đó nhưng cảm thấy bạn đã có một điểm.
nightfury

1
Tôi nghĩ đó là câu trả lời tốt nhất!
jjanczur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.