2009-06-19 37 views
5

Tôi đã tạo ra ứng dụng thử nghiệm có 3 lớpXmlSerializer.Serialize mơ hồ

  • xe
  • Đài phát thanh
  • SportCar: xe ô tô (có Đài phát thanh)

Khi quá trình serialize khi tôi tạo đối tượng của đối tượng XmlSerializer tôi sử dụng 2 đối tượng để thử nghiệm

XmlSerializer xmlSerializer = new XmlSerializer(typeof(SportCar)); 

XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(SportCar), 
    new Type[] { typeof(Car), typeof(Radio) }); 

Kết quả của phương pháp này 2 là giống hệt nhau, vì vậy tôi muốn biết sự khác biệt giữa 2 nhà xây dựng hoặc điểm quan trọng mà cần phải sử dụng # 2 constructor là gì?

Trả lời

8

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.

+0

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

+1

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ệ. –

+0

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