2009-06-30 32 views
33

Đề cập đến What is the correct way to make a custom .NET Exception serializable?
Are all .NET Exceptions serializable? ...Tại sao tôi nên luôn tạo ngoại lệ [serializable]? (NET)

Tại sao trường hợp ngoại lệ của tôi nên serializable?
Ai đó đã nói "nó có thể được coi là lỗi" nếu ngoại lệ tùy chỉnh được xác định bởi thư viện của bên thứ ba, không phải là tuần tự. Tại sao?

Tại sao ngoại lệ khác với các lớp khác trong lĩnh vực này?

Trả lời

48

Vì ngoại lệ của bạn có thể cần phải được trộn lẫn giữa các miền AppDomain khác nhau và nếu chúng không được tuần tự hóa đúng cách, bạn sẽ mất thông tin gỡ lỗi quý giá. Không giống như các lớp khác, bạn sẽ không có quyền kiểm soát liệu ngoại lệ của bạn sẽ được marshalled - nó sẽ.


Khi tôi có nghĩa là "bạn sẽ không có quyền kiểm soát" tôi có nghĩa là các lớp bạn tạo thường có một không gian hữu hạn tồn tại và sự tồn tại được biết đến. Nếu đó là một giá trị trả về và ai đó cố gắng gọi nó trong một AppDomain khác (hoặc trên một máy khác) thì họ sẽ gặp lỗi và chỉ có thể nói "Đừng dùng nó theo cách đó." Người gọi biết họ phải chuyển đổi nó thành một loại có thể được tuần tự hóa (bằng cách gói gọi phương thức). Tuy nhiên kể từ khi ngoại lệ được bubbled lên đến đầu nếu không bị bắt họ có thể vượt qua ranh giới AppDomain bạn thậm chí không biết bạn đã có. 20 cấp độ ứng dụng tùy chỉnh của bạn nằm sâu trong một AppDomain khác có thể là ngoại lệ được báo cáo tại Main() và không có gì trong quá trình chuyển đổi nó thành một ngoại lệ tuần tự cho bạn.

+0

Đó là câu trả lời thực sự tốt. – Cheeso

+2

Bạn có thể nghĩ về một tình huống cụ thể/ví dụ trong đó điều này thực sự có thể xảy ra không? – Sam

0

Ngoài câu trả lời Talljoe của, trường hợp ngoại lệ của bạn có thể được chuyển qua dịch vụ Web là tốt, trong trường hợp này là ngoại lệ cần phải được serializable/deserializable để nó có thể được biến thành XML và truyền qua các Web Service

+3

Jeffrey: bạn gần như chính xác. Khi một ngoại lệ được "gửi" qua một dịch vụ web, không phải tất cả đều cần phải được tuần tự hóa. Nó thực sự đang được chuyển đổi thành một lỗi SOAP, do đó, độ trung thực đầy đủ là không cần thiết. Ngoài ra, XML Serializer được sử dụng trong các dịch vụ ASMX cũ trả tiền ít hoặc không có sự chú ý đến [Serializable]. –

0

tôi nghĩ rằng mặc định cho tất cả các lớp nên được Serializable trừ khi chúng có chứa một lớp mà rõ ràng là không serializable. Thật khó chịu khi không thể chuyển một lớp học chỉ vì một số nhà thiết kế không nghĩ về nó.

Điều tương tự với "Final", tất cả các biến phải là "Final" theo mặc định trừ khi bạn đặc biệt nói rằng chúng là "Mutable".

Ngoài ra, tôi không chắc chắn có ý nghĩa khi có biến không riêng tư.

Ồ, cần thiết kế ngôn ngữ của riêng tôi.

Nhưng câu trả lời là, bạn không biết ngoại lệ của mình sẽ được sử dụng như thế nào và chúng được cho là có thể bị ném qua các cuộc gọi từ xa.

+1

@Bill: Ngoài ra, nhà thiết kế _did_ nghĩ về nó, nhưng quyết định không hỗ trợ tuần tự hóa.Ví dụ, làm thế nào sẽ sử dụng serialize một lớp có chứa xử lý nguồn gốc, hoặc thậm chí chỉ cần mở suối? –

+0

Trường hợp ngoại lệ không cần phải làm điều đó. Ngoài ra, 3 lớp tôi đã chạy vào và muốn tuần tự hóa trong tháng trước (bao gồm cả một ngoại lệ) không có bất kỳ hạn chế nào như vậy. Nó chỉ đơn giản là không xác định theo cách đó bởi ủy ban đã thiết kế API không thể thay đổi –

+1

Ồ, và đối với serializable của tôi theo gợi ý mặc định, nếu bạn có những điều kiện đó, các tài nguyên sẽ được đánh dấu "unserializable" mà sẽ chuỗi lên đến lớp của bạn làm cho nó unserializable, trừ khi bạn gắn thẻ chúng là "thoáng qua", do đó, nó sẽ làm việc tốt - tốt hơn so với hệ thống hiện hành. –

-1

Một nơi khác mà các đối tượng cần thiết để có thể tuần tự hóa là Phiên Asp.Net. Chúng tôi lưu trữ ngoại lệ cuối cùng trong phiên và không phải là ngoại lệ có thể tuần tự hóa cần thêm bản dịch để lưu trữ các chi tiết của chúng như serializable (chỉ định ngoại lệ ban đầu như bên trong không giúp được)

+0

Điều này nghe có vẻ giống như một lý do tại sao ngoại lệ cần phải được sdrializable trong trường hợp sử dụng * * của bạn, nhưng nó không thực sự trả lời câu hỏi chung. – stakx

+0

@stakx, khi bạn viết mã đúng, bạn nên cân nhắc các trường hợp sử dụng khác nhau, nơi nó có thể được sử dụng –

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