2010-03-16 20 views
9

Tôi nhận ra hôm nay rằng tôi đã mù quáng chỉ tuân theo yêu cầu này trong nhiều năm mà không bao giờ thực sự hỏi tại sao. Hôm nay, tôi chạy qua một NotSerializableException với một đối tượng mô hình tôi tạo ra từ đầu và tôi nhận ra đủ là đủ.Tại sao các đối tượng chuyển cần phải triển khai Serializable?

Tôi đã nói điều này là do sao chép phiên giữa các máy chủ cân bằng tải, nhưng tôi biết tôi đã thấy các đối tượng khác ở phạm vi phiên không triển khai Serializable. Đây có phải là lý do thực sự không?

Trả lời

4

Đó là lý do thực sự. Nếu nó thực sự quan trọng trong thực tế phụ thuộc hoàn toàn vào nếu máy chủ web hoặc máy chủ ứng dụng thực sự sắp xếp lại đối tượng (hoặc xác nhận rằng nó là serializable, nhưng thực tế cách duy nhất để làm điều đó là thực sự serialize nó).

Hầu hết các máy chủ ứng dụng đều có tùy chọn (ít nhất) là không nghiêm ngặt về nó. Nếu bạn không sử dụng các máy chủ cân bằng tải thực sự chia sẻ trạng thái, thì bạn có thể đã thấy nó mà không có vấn đề gì.

+0

Cảm ơn bạn. Có ý nghĩa. Vì vậy, bất kỳ đối tượng có phạm vi phiên nào không triển khai Serializable có thể không duy trì trạng thái hoặc chạy trên các máy chủ cân bằng tải không chia sẻ trạng thái không? – sma

+0

Một đối tượng sẽ không tuần tự hóa bất kể trạng thái nào mà nó duy trì, miễn là nó không thực hiện Serializable, vì vậy nếu tôi hiểu câu hỏi của bạn một cách chính xác, câu trả lời là bất kỳ đối tượng nào được đưa vào phiên không thực hiện Serializable thực tế không được tuần tự hóa bởi vùng chứa, vì vậy bạn không thấy sự cố. – Yishai

10

Bởi vì để được truyền qua dây, chúng cần phải nối tiếp với một biểu mẫu có thể được đặt trên dây.

Giống như nhị phân, hoặc xml, Json, hoặc simillar

Có thông tin thêm ở đây ... Should any domain object, not be serializable?

+0

Tôi không nghĩ rằng bạn cần phải triển khai Serializeble để có khả năng hiển thị unhayalling XML hoặc JSON trên một dây. Bạn cần nó cho các định dạng nhị phân - ví dụ trong RMI. Nhưng tôi nghĩ lý do chính là vì các DTO này là một phần của một phiên HTTP và do đó CÓ thể được serializable theo đặc tả servlet. – HDave

1

Tôi nghĩ khái niệm này giống như được hỏi, lý do tại sao thức ăn rắn phải được nhai trước khi được nuốt để tiêu hóa. Nhưng tất nhiên, sự khác biệt là tiêu hóa tốt không thể trong anyway deserialized.

Tôi nhớ sử dụng Sun RPC (ngày nay được gọi là ONC RPC) thực hiện mã hóa XDR vì nền tảng/hệ thống máy tính đại diện cho dữ liệu của chúng theo dạng tương ứng. Ví dụ: lớn endian vs nhỏ endian.

Nhưng JVM, bất kể máy tính là người lớn, vì vậy độ tin cậy không phải là lý do.

Cấu trúc dữ liệu trong bộ nhớ máy tính có con trỏ và tất cả các phần tử của đối tượng không được nằm trên khối bộ nhớ liền kề. Tuy nhiên, khi bạn truyền một đối tượng qua i/o đến một hệ thống khác, bạn không thể vượt qua sự phân bố bộ nhớ của đối tượng đó.

Một đối tượng cần được tuần tự hóa trước khi được lưu trữ trong cơ sở dữ liệu vì bạn không và không thể sao chép sắp xếp thay đổi động của bộ nhớ hệ thống.

Lớp biểu diễn dữ liệu của chúng tôi trên các mạng đều dựa trên luồng bit. Do đó, khi bạn muốn truyền dữ liệu từ một hệ thống này sang một hệ thống khác, bạn phải chuyển đổi dữ liệu chiều được biểu diễn trong bộ nhớ thành bộ nhớ có thể được truyền trực tiếp qua các byte mạng theo byte. Trên thực tế, từng chút một và thường xuyên bị nén và mã hóa bảo mật. Các thói quen nén và mã hóa là các luồng bit-oo và các luồng bit được giả định. Thiết bị chuyển mạch mạng có tính năng che cấu trúc oo. Truyền tải mạng thậm chí không nhìn thấy bit. Các bit được mã hóa thành tín hiệu truyền dẫn thường là các sinusoid tương tự và sau đó được điều chế. Các quy trình này không hoạt động trên sơ đồ đa chiều/phân cấp của dữ liệu có cấu trúc oo.

Tôi đoán bạn có thể thực hiện mức độ obfuscation và mã hóa đối tượng, nhưng bạn vẫn phải cho phép hệ thống chuyển đổi chúng thành luồng bit, bằng cách chuyển đổi chúng thành luồng char trước tiên.

Marshalling là khi người chăn cừu có một đàn cừu và marshalls họ thro một cây cầu đơn cừu trên vùng nước gặp khó khăn.Do đó, một marshaller phải sắp xếp các đối tượng của chúng ta thành các sơ đồ nối tiếp với các tham chiếu được viết, để khi đàn cừu thông tin xuất hiện từ đầu kia của cây cầu, chúng ta có thể tập hợp lại chúng vào sơ đồ phân cấp của nó bằng cách liên hợp-demarshaller . Trong trường hợp của chúng tôi, con cừu của chúng tôi không phải là marshalled thro chỉ là một cây cầu nhưng thro hẹp và precarious windings và lở đất nơi thiết bị truyền dẫn mạng tại mỗi lần lượt lưu trữ một bản sao của marshalled cừu để đảm bảo họ có thể gửi lại bản sao trong trường hợp bất kỳ cừu đã rơi xuống một khe núi.

+1

* Tiêu hóa tốt không thể trong anyway deserialized * Nó phụ thuộc vào những gì thực phẩm đã được ban đầu. Con chó của tôi có thể làm điều này> :) –

+1

Con chó của tôi cũng ăn thực phẩm được tuần tự hóa. ugghh. Một lý thuyết tồn tại tại sao một con chó đôi khi ăn thực phẩm được tuần tự hóa. Lý do là các đường ruột của chúng ngắn ngủi nên khi một con chó ăn thức ăn được tuần tự hóa riêng của nó, nó sẽ kéo dài các vùng tiêu hóa của nó hai lần. Và khi nó ăn thức ăn được tuần tự hóa bởi một động vật có vú khác như ngựa, nó đang mượn hệ thống tiêu hóa của ngựa vì nó không thể xử lý chất xơ cỏ hiệu quả như ngựa hay bò. –

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