2013-02-10 27 views
6

Gần đây tôi đã viết một số đối tượng có thể tuần tự hóa cũng có giao dịch với logic cụ thể và có vòng đời cụ thể. Để cho nó hoạt động đúng, nó phải được khởi tạo với một hàm tạo thích hợp, có các đối số bắt buộc. Tuy nhiên, đối với các mục đích tuần tự hóa, tôi cũng phải thêm một hàm tạo mặc định công khai.Sử dụng thuộc tính [Lỗi thời] để hướng dẫn các nhà phát triển không sử dụng các phần của API

Đối tượng sẽ được API công khai và các nhà phát triển bên thứ ba của chúng tôi có thể khởi tạo và sử dụng nó. Mặc dù sẽ có một tài liệu thích hợp để làm thế nào để thao tác chính xác với đối tượng đó, nó không đảm bảo rằng ai đó sẽ bị cám dỗ sử dụng hàm tạo không chính xác - và sau đó gặp rắc rối.

Tôi đang tìm một cách gọn gàng để áp dụng một số hướng dẫn trong khi các nhà phát triển bên thứ ba đang viết mã của họ. Thuộc tính Obsolete đến với tâm trí của tôi - tôi có thể chú thích hàm tạo dựng tuần tự với một chú thích thích hợp dưới dạng tin nhắn. Thông báo sau đó sẽ xuất hiện trong các cảnh báo đầu ra và hướng nhà phát triển đến đúng dòng mã. Ngoài ra, việc sử dụng hàm tạo sẽ được đánh dấu thích hợp bởi cả Visual Studio và bất kỳ phần bổ sung kiểm tra mã nào được sử dụng.

Điều làm phiền tôi trong cách tiếp cận này là mục đích của thuộc tính Obsolete hoàn toàn khác. Đó là ý nghĩa ngữ nghĩa là mục trang trí không được chấp nhận và có thể sẽ bị xóa trong các phiên bản tiếp theo. Trong kịch bản tạo dựng tuần tự, điều này là sai, và sẽ có sự khác biệt giữa cách sử dụng và ý nghĩa của thuộc tính này. Chưa kể tùy chọn "xử lý cảnh báo dưới dạng lỗi" có thể được bật trong một số phòng ban phát triển ...

Vì vậy, câu hỏi là - đó có phải là một thực tiễn có thể chấp nhận cho việc sử dụng thuộc tính đó không? Có cách nào khác hợp pháp và phổ quát để đạt được hiệu quả tương tự (bằng cách phổ quát tôi có nghĩa là không dựa vào tiện ích kiểm tra mã bên thứ 3 và vv - Tôi không kiểm soát ai sử dụng mã và thiết lập của họ) là gì?


Liên quan đến nhận xét trong câu trả lời bên dưới, (tôi vẫn hữu ích), tôi phải làm rõ rằng tôi đang sử dụng hàm tạo mặc định được bảo vệ trên lớp kế thừa. Hàm khởi tạo có hỗ trợ tuần tự hóa XML, nhưng không nên được sử dụng để khởi tạo lớp trong logic nghiệp vụ. Các lớp kế thừa nên gọi một số các hàm tạo cơ sở khác và các nhà phát triển viết các lớp thừa kế cần biết điều đó. Tuy nhiên, các nhà phát triển bắt nguồn từ mã này cũng phải có phương tiện để kích hoạt tuần tự hóa XML cho các lớp kế thừa của họ nếu cần.

+4

Nó không hoàn toàn giống nhau, nhưng việc sử dụng [EditorBrowsable (EditorBrowsableState.Never)] sẽ ẩn hàm khởi tạo khỏi intellisense để ngăn chặn một nhà phát triển nhận nó như một gợi ý và sử dụng nó một cách sai lầm mà không kiểm tra tài liệu. – fsimonazzi

+0

@fsimonazzi, cảm ơn thông tin hữu ích. Trong cùng một thời trang không ai có thể ngăn chặn một thành viên lỗi thời bị truy cập bởi mã người dùng, vì vậy đề xuất của bạn là khá hợp lệ và nhiều hơn nữa tại chỗ. –

Trả lời

3

Hm, tôi không nghĩ rằng đây là giải pháp tốt. Tuy nhiên, bạn có thực sự cần một constructor mặc định?

Lưu ý rằng API tuần tự hóa có các phương thức để tạo các cá thể chưa được khởi tạo mà không cần sử dụng một hàm tạo nào (xem MSDN: FormatterServices.GetUninitializedObject).

Ngoài ra, hàm tạo tuần tự tùy chỉnh thông thường không phải là hàm tạo mặc định mà còn là một hàm tạo tham số SerializationInfo và một StreamingContext. Nếu bạn có một số serialization tùy chỉnh, bạn cũng có thể giải quyết vấn đề của bạn bằng cách làm cho constructor mặc định bên trong và áp dụng một InternalsVisibleToAttribute cho assembly thực hiện serialization.

+1

Để làm rõ về vấn đề deserialization, tôi đã giải quyết không phải là nhị phân (mặc định), nhưng serialization XML là một phần của khuôn khổ .NET. Nó cần constructor parameterless. Hàm khởi tạo không cần thiết là 'public', nhưng nếu lớp đó được thừa hưởng và phải bảo toàn khả năng tuần tự hóa, hàm tạo nên ít nhất là' protected' (trừ khi, dĩ nhiên, nếu một số constructor khác làm việc cho bạn, nhưng đó không phải là trường hợp của vấn đề câu hỏi). –

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