2011-02-02 12 views
5

Bu bir ya da daha az yapıya sahip:Her bir liste öğesinin serileştirilmiş adını nasıl bir list <SomeStruct>() in C# içinde geçersiz kılabilirim?

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

Bazen bu yapıyı XML'e tek bir nesne olarak serileştiririm, bu da iyi çalışır, ancak bazen bu yapının bir <> Listesini de serileştirmem gerekir.

Üst seviye eleman ismini ayarlamak için bunu kullandım:

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

XmlSerializer, her bir liste öğesi olan TCustomer'ı çağırmakta ısrar ediyor. XmlSerializer'a TCustomer yerine Müşteri adını kullanmasını nasıl söyleyebilirim?

cevap

2

Tüm cevaplar için teşekkürler. Bununla birlikte, benim özel sorunumun talihisi, şu kadar basit olduğu ortaya çıktı:

+0

Tam olarak aradığım şey! Teşekkür ederim! – Sergey

1

Bunu sınıf/yapı düzeyinde denemedim, ancak sınıf içindeki bir listeyi serileştirmem gerektiğinde böyle yaparım.

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

Bazı nesne seri şeklini özelleştirmek için IXmlSerializable uygulayabilirsiniz: Neyse

IXmlSerializable Interface

, gerçek bir türüdür çünkü serileştirici öğelerin TCustomer türünü çağırır görünüyor List (TCustomer, ???, burada ?? TCustomer genel parametre türünün gerçek türü olacaktır).

IXmlSerializable'u uygulamadan nesnelerin serileştirme şeklini değiştirmeyeceğim (yani, seri hale getirilmiş bir metin değiştirmeyi veya başka bir şeyden kaçınmayı!).

7

o XmlRoot niteliği yalnızca kök elemanı için de geçerlidir

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

Güzel! Açıklayabilirseniz iyi olur mu? –

+0

Öznitelik hedefi XmlSerializer tarafından serileştirildiğinde oluşturulan XML şemasını denetler. - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute.aspx – Anuraj

+0

Bu daha doğru - XmlTypeAttribute sınıfının yeni bir örneğini başlatır ve XML türünün adını belirtir. - http://msdn.microsoft.com/en-us/library/573s2dsz.aspx – Anuraj

5

yardımcı Umut, bu nedenle CustomerList seri zaman o TCustomer için geçerli değildir.

Kendi serileştirme işleminizi gerçekleştirmeden, CustomerList sınıfında Customer olarak serileştirmek için TCustomer değiştirebileceğinizi düşünmüyorum. Ama vermeli

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

Eğer benzer xml ... böyle bir şey yapabilirsiniz:

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

Bu genel bir listeden CustomerList değiştirir, ancak size adlandırmayı kontrol etmenizi sağlar.

+0

1 gibi kullanıldığında adı kontrol etmek için XmlType kullanabileceğinizi bilmiyordum. Kabul edilen cevabın standart türler için ürün isimlerinin serileştirilmesinde de çalıştığı bir durumla karşılaşmadım. 'List MyList' gibi, bu yanıt, ancak bu durumda çocuk etiket adlarını yeniden adlandırma işlemek için yeterince esnektir. Ayrıca, sadece liste öğesi etiketlerini yeniden adlandırmanız gerekirse, sadece [XmlArrayItem ("customer")] 'ın gerçekten gerekli olduğunu fark ettim. – Henrik

İlgili konular