2011-02-02 7 views
5

Mam struct mniej więcej tak:Jak mogę przesłonić zserializowaną nazwę każdego elementu listy na liście <SomeStruct>() w C#?

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

czasami serializacji ten struct do XML jako pojedynczy obiekt, który działa prawidłowo, ale czasami trzeba serializacji listy <> z tej struktury .

Użyłem tego, aby ustawić poziom górny element name:

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

XmlSerializer jednak nalega na wywołanie element listy TCustomer. Jak mogę poinformować XmlSerializer, aby używał nazwy Klient zamiast klienta TC?

Odpowiedz

2

Dziękuję za wszystkie odpowiedzi. Rozwiązanie dla mojego konkretnego problemu okazało się jednak tak proste, jak:

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

Dokładnie tego, czego szukałem! Dziękuję Ci! – Sergey

1

Nigdy nie próbowałem tego na poziomie klasy/struktury, ale tak to robię, gdy potrzebuję serializować listę wewnątrz klasy.

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

można zaimplementować IXmlSerializable, aby dostosować sposób jakiś obiekt jest seryjny:

IXmlSerializable Interface

W każdym razie wydaje się, że serializer wzywa TCustomer rodzaj przedmiotów, ponieważ jest to rzeczywisty typ List (TCustomer), gdzie będzie rzeczywisty typ ogólnego parametru typu TCustomer).

Nie zmieniłbym sposobu XmlSerializer serializacji obiektów bez implementacji IXmlSerializable (to znaczy, unikaj zastępowania tekstów po serializacji lub cokolwiek!).

7

Nadzieja pomaga

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

Miło! Byłoby miło, gdybyś mógł to wyjaśnić? –

+0

Steruje schematem XML, który jest generowany, gdy cel atrybutu jest serializowany przez XmlSerializer. - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute.aspx – Anuraj

+0

To jest bardziej właściwe - Inicjuje nową instancję klasy XmlTypeAttribute i określa nazwę typu XML. - http://msdn.microsoft.com/en-us/library/573s2dsz.aspx – Anuraj

5

Atrybut XmlRoot stosuje się tylko do elementu głównego, więc to nie ma zastosowania do TCustomer podczas szeregowania CustomerList.

Bez implementacji własnej serializacji, nie sądzę, aby można było zmienić numer TCustomer w celu przekształcenia do postaci Customer w klasie CustomerList. Ale można zrobić coś takiego ...

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

To powinno dać xml podobny do:

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

zmienia swój CustomerList z listy leków generycznych, ale pozwala kontrolować nazewnictwa.

+0

Nie widziałem jeszcze przypadku, w którym zaakceptowana odpowiedź działa również w przypadku serializacji nazw elementów dla standardowych typów jak 'Lista MyList', ta odpowiedź jest jednak wystarczająco elastyczna, aby obsłużyć zmianę nazw znaczników podrzędnych w tym konkretnym przypadku. Także jeśli potrzebujesz zmienić nazwy znaczników elementów listy, zauważyłem, że tylko '[XmlArrayItem (" klient ")]' jest rzeczywiście potrzebny – Henrik

Powiązane problemy