2009-03-13 26 views
10

Tôi muốn triển khai IXmlSerializable trên một lớp và chỉ ghi đè ReadXml hoặc WriteXml, nhưng không phải cả hai. Nếu tôi không triển khai thực hiện IXMLSerializable trên lớp này, XMLSerializer sẽ tự động tuần tự hóa tất cả các thành viên. Tôi muốn hành vi mặc định đó áp dụng cho trường hợp không ghi đè. Tuy nhiên, kể từ khi IXmlSerializable là một giao diện, và không phải là một lớp cơ sở, tôi không chắc chắn làm thế nào để đi về điều đó.Khi triển khai IXmlSerializable, cách chỉ ghi đè ReadXml hoặc WriteXml chứ không phải cả hai?

Ngoài ra, tôi cần phải, trong một trường hợp, thực hiện hành vi mặc định và khi hoàn tất, hãy thêm một số mã phụ. Vì vậy, tôi muốn ghi đè và gọi lại hành vi của lớp 'cơ sở'. Một lần nữa, điều này sẽ là tầm thường nếu có một lớp cơ sở, nhưng không quá tầm thường vì đây là một giao diện.

Cảm ơn!

Trả lời

4

Khả năng thực hiện các hành động trước/sau khi tuần tự hóa/deserialisation được cung cấp với các thuộc tính. Đánh dấu một phương thức với OnDeserializedAttribute cho nó được gọi sau khi một thể hiện đã được deserialised, chỉ cần đảm bảo phương pháp có chữ ký phải:

[OnDeserializedAttribute()] 
private void RunThisMethod(StreamingContext context) { 
    // ... 
} 

NB. Thuộc tính này hoạt động cho các trình định dạng nhị phân, SOAP và DataAttribute, nhưng không phải là cho XmlSerializer. Không có thuộc tính hoặc cơ chế nào khác ngoài việc triển khai thực hiện IXmlSerializable.

Cũng đừng quên rằng bạn có thể đọc tài liệu XML trực tiếp và viết mã để (de) tuần tự hóa.


Original câu trả lời: Nếu bạn cần phải hoàn toàn ghi đè lên một trong những serialization hoặc deserialisation (và do đó thực hiện IXmlSerializable sau đó bạn phải làm cả hai mình

Có thể tận dụng các thuộc tính và khác. cơ chế để tránh sử dụng IXmlSerializable, bạn có thể mở rộng câu hỏi với các chi tiết của tại sao bạn cần phải thực hiện chỉ là một trong ReadXml hoặc WriteXml.

+0

Đó là một nhu cầu lạ: Vào cuối quá trình deserialization của các lớp nhất định tôi cần phải đăng ký các trường hợp mới được tạo ra. Vì vậy, tôi đã hy vọng: (1) Để lại tuần tự hóa vì nó là, và (2) Ghi đè lên quá trình deserialization và thêm mã đăng ký của tôi. – Eric

+0

Vì vậy, bạn cần một tương đương với OnDeserializedAttribute áp dụng cho XML Serialiser? – Richard

+0

OnDeserialized sẽ thực hiện thủ thuật! Sao chép điều này vào văn bản và tôi sẽ đánh dấu phần này là đã trả lời. – Eric

1

Bạn sẽ cần phải triển khai cả hai phương pháp, nhưng đó là mức độ đầy đủ trách nhiệm của bạn (theo như trình biên dịch liên quan). Bạn có thể trả về null hoặc ném một ngoại lệ trong phương thức mà bạn sẽ không sử dụng.

EDIT

I'd like the default behavior to apply for the non-overridden case.

hành vi mặc định gì được bạn đề cập đến? Vì bạn đang thực hiện một giao diện, không có hành vi mặc định.

+0

Nếu tôi không thực hiện IXmlSerializable trên Clas này s, XMLSerializer sẽ tự động tuần tự hóa tất cả các thành viên. Đó là hành vi 'mặc định' mà tôi đang tìm kiếm. – Eric

+0

Bạn có thể ném một NotSupportedException trong phương thức không được hỗ trợ –

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