2011-02-02 21 views
5

Tôi có một cấu trúc nhiều hơn hoặc ít hơn như thế này:Làm cách nào tôi có thể ghi đè tên đã được đăng của mỗi mục danh sách trong Danh sách <SomeStruct>() bằng C#?

[Serializable] 
[XmlRoot("Customer")] 
public struct TCustomer 
{ 
    string CustomerNo; 
    string Name; 
} 

đôi khi tôi serialize này struct này để XML như là một đối tượng duy nhất, hoạt động tốt, nhưng tôi cũng đôi khi cần phải serialize một danh sách <> của struct này .

Tôi đã sử dụng này để thiết lập tên phần tử cấp cao nhất:

[Serializable] 
[XmlRoot("Customers")] 
public class CustomerList : List<TCustomer> { } 

XmlSerializer Tuy nhiên, khăng khăng gọi mỗi mục TCustomer. Làm thế nào tôi có thể yêu cầu XmlSerializer sử dụng tên Khách hàng thay vì TCustomer?

Trả lời

2

Cảm ơn tất cả các câu trả lời. Tuy nhiên, sự sollution đối với vấn đề cụ thể của tôi, hóa ra lại đơn giản như:

[XmlRoot("Customers")] 
public class Customers 
{ 
    [XmlElement("Customer")] 
    public List<TCustomer> List = new List<TCustomer>(); 
} 
+0

Chính xác những gì tôi đang tìm kiếm! Cảm ơn bạn! – Sergey

1

Tôi chưa bao giờ thử điều này ở cấp lớp/cấu trúc, nhưng đây là cách tôi thực hiện khi tôi cần sắp xếp một danh sách trong một lớp.

[XmlArray("ConfigurationList")] 
    [XmlArrayItem("Configuration")] 
    private List<string> pConfigList = new List<string>(); 
0

Bạn có thể thực hiện IXmlSerializable để tùy chỉnh một cách nào đó đối tượng được đăng:

IXmlSerializable Interface

Dù sao, có vẻ như serializer mà các cuộc gọi TCustomer các loại mặt hàng vì đây là loại thực tế của số List (TCustomer là ???, trong đó ??? sẽ là loại thực tế của loại thông số chung TCustomer).

Tôi sẽ không thay đổi cách XmlSerializer nối tiếp các đối tượng mà không cần triển khai IXmlSerializable (Ý tôi là, tránh việc thay thế văn bản sau chuỗi hoặc bất kỳ thứ gì!).

7

Hy vọng nó giúp

[XmlType("Customer")] 
[XmlRoot("Customer")] 
public struct TCustomer 
{ 
    public string CustomerNo; 
    public string Name; 
} 
+0

Tốt! Nó sẽ là tốt đẹp nếu bạn có thể giải thích, mặc dù? –

+0

Kiểm soát lược đồ XML được tạo khi mục tiêu thuộc tính được tuần tự hóa bởi XmlSerializer. - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute.aspx – Anuraj

+0

Điều này thích hợp hơn - Khởi tạo phiên bản mới của lớp XmlTypeAttribute và chỉ định tên của loại XML. - http://msdn.microsoft.com/en-us/library/573s2dsz.aspx – Anuraj

5

Thuộc tính XmlRoot chỉ áp dụng cho các phần tử gốc, vì vậy nó không áp dụng cho TCustomer khi bạn đang serializing CustomerList.

Nếu không triển khai chuỗi tuần tự của riêng mình, tôi không nghĩ bạn có thể thay đổi TCustomer để tuần tự hóa thành Customer trong lớp CustomerList. Nhưng bạn có thể làm điều gì đó như thế này ...

[Serializable] 
[XmlRoot("customerList")] 
public class CustomerList 
{ 
    [XmlArray("customers")] 
    [XmlArrayItem("customer")] 
    public List<TCustomer> Customers { get; set; } 
} 

Điều đó sẽ cung cấp cho bạn xml tương tự như:

<customerList> 
    <customers> 
     <customer /> 
     <customer /> 
     <customer /> 
    </customers> 
</customerList> 

này thay đổi CustomerList của bạn từ một danh sách chung, nhưng nó cho phép bạn kiểm soát cách đặt tên của bạn.

+0

Tôi chưa thấy trường hợp câu trả lời được chấp nhận cũng hoạt động để sắp xếp tên mục cho các loại tiêu chuẩn giống như 'List MyList', tuy nhiên câu trả lời này đủ linh hoạt để xử lý đổi tên các tên thẻ con trong trường hợp cụ thể đó. Ngoài ra nếu bạn chỉ cần đổi tên các thẻ phần tử danh sách, tôi đã nhận thấy rằng chỉ có '[XmlArrayItem (" khách hàng ")]' thực sự là cần thiết – Henrik

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