2010-04-14 47 views
27

Tôi sẽ nghĩ rằng việc thêm thuộc tính đó vào một giao diện sẽ hữu ích đảm bảo bạn không tạo các lớp có sử dụng giao diện và quên làm cho chúng có thể tuần tự hóa được.Tại sao giao diện không [Serializable]?

Đây có thể là một câu hỏi rất cơ bản, nhưng tôi muốn hỏi các chuyên gia.

+0

Bạn nên xem câu trả lời này nếu bạn muốn cách stackoverflow http: //.com/questions/1333864/xml-serialization-of-interface-property – juharr

Trả lời

65

Giao diện xác định hợp đồng và không có trạng thái riêng.

Tuần tự hóa là về lưu và tải trạng thái vào và ra khỏi mô hình đối tượng.

Không có nhiều điểm để sắp xếp thứ gì đó không giữ trạng thái.


Để trả lời câu hỏi thực tế của buộc một thực hiện một giao diện được Serializable - đây là lý do tại sao giao diện ISerializable tồn tại.

Trong .NET, bạn có thể khai báo một giao diện mà nên thực hiện các giao diện khác:

interface MustBeSerializable : ISerializable {} 

Xem một số chi tiết thông tin here.

+0

Giải thích tuyệt vời :-) – Raja

+0

Giải thích tuyệt vời. –

+6

Ủng hộ của quỷ: giao diện ngụ ý * cách * đối tượng hoạt động với trạng thái của chúng. Giao diện không có trạng thái nhưng chúng sẽ được sử dụng để xác định các đối tượng làm và hợp đồng với cách mà trạng thái có thể được truy cập. – Dinah

4

Nếu bạn muốn để buộc các lớp học mà thực hiện giao diện tùy chỉnh của bạn IMyInterface là serializable bạn có thể xác định nó có:

interface IMyInterface : ISerializable 
{ 
    // Custom interface definition 
} 

Điều này cho thấy rõ ràng hơn rằng lớp thực hiện nên hỗ trợ serialization. Điều này không loại bỏ sự cần thiết phải đánh dấu lớp với thuộc tính [Serializable].

IIRC, bạn cũng có thể tạo quy tắc tùy chỉnh FxCop kiểm tra các lớp kế thừa từ IMyInterface được đánh dấu bằng thuộc tính tương ứng [Serializable] và cách này loại bỏ sự cần thiết phải thực hiện tuần tự tùy chỉnh.

2

Có một số lý do tốt mặc dù bí truyền đằng sau giao diện là gì và không phải là điều này khiến cho điều này không thể thực hiện được. Điều đó nói rằng tuy nhiên: Tôi đồng ý với bạn. Có rất nhiều thứ sẽ hữu ích nếu chúng ta có thể kết hợp chúng thành các giao diện. [Serializable] và statics đến tâm trí.

Mặc dù chúng không phù hợp với triết lý của giao diện, chúng dường như kết hợp vùng màu xám trống này trong OOP thừa kế đơn. Có tất nhiên công việc xung quanh nhưng họ cảm thấy rất ép buộc so với ý định ban đầu.

2

Vâng, có một lý do mà các lớp học mới không được đánh dấu là serializable theo mặc định: Bằng cách thêm thuộc tính Serializable, bạn thừa nhận rằng bạn đã đảm bảo rằng serialization trong lớp học của bạn làm việc, bằng cách chọn các kiểu dữ liệu thích hợp ví dụ của bạn các trường và bằng cách thêm logic tuần tự hóa, nếu cần.

Vì vậy, nếu bạn "quên" để thêm thuộc tính Serializable vào lớp học của mình, bạn có thể cũng quên kiểm tra xem việc tuần tự hóa có thực sự hoạt động trên lớp của bạn hay không. Cấp, trong nhiều trường hợp nó sẽ làm việc "ra khỏi hộp", do đó, thêm thuộc tính là tất cả những gì còn lại, nhưng bạn có nghĩa vụ phải kiểm tra kỹ và xác nhận rõ ràng thực tế đó (bằng cách thêm thuộc tính theo cách thủ công).

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