2011-11-22 28 views
9

Tôi cần serialize IEnumerable. Đồng thời tôi muốn nút gốc là "Kênh" và nút cấp thứ hai - Kênh (thay vì ChannelConfiguration).Ghi đè tên lớp cho XmlSerialization

Dưới đây là định nghĩa serializer tôi:

_xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>), new XmlRootAttribute("Channels")); 

Tôi đã overriden nút gốc bằng cách cung cấp XmlRootAttribute nhưng tôi đã không tìm thấy một tùy chọn để thiết lập kênh thay vì ChannelConfiguration như nút tầng hai.

Tôi biết tôi có thể làm điều đó bằng cách giới thiệu trình bao bọc cho IEnumerable và sử dụng XmlArrayItem nhưng tôi không muốn làm điều đó.

+3

tại sao bạn không muốn làm tùy chọn dễ dàng? hết tò mò? (cũng lưu ý: sử dụng các hàm tạo không tầm thường có nghĩa là bạn ** phải ** cache bộ nối tiếp, nếu không bạn bị rò rỉ các assembly; cơ bản 'XmlSerializer (Type)' constructor không bị ảnh hưởng này) –

+0

Bạn có phải là chủ sở hữu của lớp ChannelConfiguration không, bạn có thể trang trí nó với các thuộc tính? Nếu có, tôi có thể là một giải pháp. –

+0

@MarcGravell, có thể bạn là đúng và tôi nên sử dụng một wrapper – SiberianGuy

Trả lời

15

Giống như vậy:

XmlAttributeOverrides or = new XmlAttributeOverrides(); 
or.Add(typeof(ChannelConfiguration), new XmlAttributes 
{ 
    XmlType = new XmlTypeAttribute("Channel") 
}); 
var xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>), or, 
    Type.EmptyTypes, new XmlRootAttribute("Channels"), ""); 
xmlSerializer.Serialize(Console.Out, 
    new List<ChannelConfiguration> { new ChannelConfiguration { } }); 

Lưu ý bạn phải bộ nhớ cache và tái sử dụng ví dụ serializer này. Tôi cũng sẽ nói rằng tôi khuyên bạn nên sử dụng cách tiếp cận "lớp bọc" - đơn giản hơn, không có nguy cơ rò rỉ lắp ráp và IIRC nó hoạt động trên nhiều nền tảng hơn (chắc chắn tôi đã thấy một trường hợp ở trên) hoạt động khác nhau trên một số triển khai - SL hoặc WP7 hoặc một cái gì đó tương tự).

Nếu bạn có quyền truy cập vào các loại ChannelConfiguration, bạn cũng có thể chỉ cần sử dụng:

[XmlType("Channel")] 
public class ChannelConfiguration 
{...} 

var xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>), 
    new XmlRootAttribute("Channels")); 
xmlSerializer.Serialize(Console.Out, 
    new List<ChannelConfiguration> { new ChannelConfiguration { } }); 
11

Điều này nên thực hiện thủ thuật, nếu tôi nhớ chính xác.

[XmlType("Channel")] 
public class ChannelConfiguration { 

} 
+1

Chỉ hoạt động nếu bạn sở hữu lớp và có thể trang trí nó. –

+0

Không, nó không: (XmlElement không thể áp dụng cho một lớp – SiberianGuy

+0

Tôi nghĩ bạn có nghĩa là XmlRoot ("Kênh")? –