Sự khác biệt lớn là khi bạn cần phải nói cho XmlSerializer
về phụ lớp - ví dụ:
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car),
new Type[] { typeof(SportCar), typeof(Radio) });
Ở đây, không có thông tin thêm nếu ta không biết (chỉ từ Car
) về một trong hai SportCar
hoặc Radio
- vì vậy nếu bạn cung cấp cho nó một đối tượng mà thực sự là một SportCar
, nó sẽ thất bại:
Car car = new SportCar {...};
xmlSerializer.Serialize(destination, car);
bạn cũng có thể làm điều này bằng thiết [XmlInclude(typeof(SportCar))]
chống lại định nghĩa Car
loại:
[XmlInclude(typeof(SportCar))]
public class Car {...}
Đây là dễ dàng hơn, nhưng chỉ có thể nếu loại Car
là trong một hội đồng mà biết về SportCar
. Nhưng bạn thường phải làm biết điều này, vì vậy, XmlInclude
là tùy chọn được ưu tiên.
Ngoài ra: có một số lợi ích hiệu quả của XmlInclude
; đằng sau hậu trường, hệ thống sử dụng thế hệ động để tạo hiệu quả cho XmlSerializer
. Vì lý do này, bạn thường nên giữ (và tái sử dụng) ví dụ XmlSerializer
bạn tạo; ví dụ, bằng cách lưu trữ nó trong một trường tĩnh. Tuy nhiên, hệ thống tự động thực hiện việc này cho việc sử dụng mặc định (new XmlSerializer(typeof(Car))
) - tức là cho dù bạn sử dụng hàm tạo này bao nhiêu lần, nó chỉ tạo ra mã động một lần. Nếu bạn sử dụng hàm tạo phức tạp hơn (new XmlSerializer(typeof(Car),new Type[] { typeof(SportCar), typeof(Radio) })
), nó sẽ làm việc tạo kiểu mỗi lần.
Nguồn
2009-06-19 07:23:38
Sự khác biệt trong đầu ra là gì nếu tôi chỉ định thông tin lớp phụ? (Tôi mới vào quá trình Serialize) – Anonymous
Không có sự khác biệt về đầu ra giữa việc sử dụng phương pháp XmlInclude và phương thức khởi tạo (kiểu mới []]; chúng tương đương nhau. Nếu bạn không làm, và yêu cầu một XmlSerializer (typeof (Car)), nhưng cung cấp cho nó một SportCar - nó sẽ ném một ngoại lệ. –
Tôi thấy, sau khi đọc chủ đề về XmlSerializer trên C# 3.0 trong một nutshell và trở lại để đọc câu trả lời của bạn mà đề cập đến về "về các lớp phụ" nó làm cho tôi hiểu cách XmlSerializer làm việc. (Tôi mua một cuốn sách khác để nghiên cứu về C#, quá tệ.) – Anonymous