2012-07-24 16 views
7

Tek bir dize olarak RGB renk değerini kodlar aşağıda türü için IXmlSerializable uygulamak:XmlAttribute olarak özel bir IXmlSerializable nasıl kullanılır?

public class SerializableColor : IXmlSerializable 
{ 
    public int R { get; set; } 
    public int G { get; set; } 
    public int B { get; set; } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     var data = reader.ReadString(); 
     reader.ReadEndElement(); 
     var split = data.Split(' '); 
     R = int.Parse(split[0]); 
     G = int.Parse(split[1]); 
     B = int.Parse(split[2]); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteString(R + " " + G + " " + B); 
    } 
} 

tek dize olduğundan, ben yer kazanmak için bir özellik olarak saklamak istedi. Ama en kısa sürede benim özelliğine [XmlAttribute] ekledikçe, aşağıdaki özel durum alıyorum: { ". Tipi SerializableColor üyesi 'Renk' serileştirmez Can XmlAttribute/xmlText türleri IXmlSerializable uygulanması kodlamak için kullanılamaz"}

Bunun bir özellik olarak çalışmasını sağlamanın bir yolu var mı?

cevap

4

Hata, tam olarak ne ifade ettiği anlamına gelir. IXmlSerializable, XML serileştirmesinin tamamen özelleştirilmesini beklediği için IXmlSerializable uygulandığında bu XML serileştirme niteliklerini kullanamazsınız. Öznitelikleri kullanarak XmlSerializer ile seri hale getirilebilir sınıf yapmak istiyorsanız bunu yapabilirsiniz.

[XmlRoot("SerializableColor")] 
public class SerializableColor 
{ 
    [XmlAttribute("R")] 
    public int R { get; set; } 
    [XmlAttribute("G")] 
    public int R { get; set; } 
    [XmlAttribute("B")] 
    public int B { get; set; }  
} 

Ayrıca XmlSerializable sizin uygulanması için:

public void ReadXml(XmlReader reader) 
    { 
     string data = null; 

     reader.MoveToAttribute("Color"); 
     if (reader.ReadAttributeValue()) 
     { 
      data = reader.Value; 
     } 
     reader.ReadEndElement(); 

     var split = data.Split(' '); 
     R = int.Parse(split[0]); 
     G = int.Parse(split[1]); 
     B = int.Parse(split[2]); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteAttributeString("Color", R + " " + G + " " + B); 
    } 

, diğer taraftan, yapmanız mümkün aradığınız tüm geri dönüşümlü olan bir rengin kısa dize iyi temsil edilmeleri var ise ColorTranslator Class'a bakın. Özellikle, FromHtml ve ToHtml yöntemlerine bakın.

+0

Cevabınız için teşekkür ederiz. Yine de iki sorum var. İlk olarak, uygulama nasıl doğru değildir? [Belgede] verilen örnekte olduğu gibi (http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx) (yorum bölümünde açıklanan adendum). Ve ikincisi, örnekle alakalı XmlRoot özniteliğidir? Hangi farklılıklar var? –

+0

Uygulamanın doğru XML üretmemesiyle ilgili olarak, "Çerçeve bir sarıcı eleman yazıyor ve XML yazıcısını başlattıktan sonra konumlandırıyor." Cevabı gözden geçireceğim. Aslında XmlRoot'u XmlSerializer tarafından çıkarılabileceğinden çıkmış olabilirsiniz, ancak bir sınıftaki varsayılan serileştirme davranışını geçersiz kıldığımda, bunu genellikle tüm bileşenleri üzerinde netlik için yapıyorum. – JamieSee

+0

OP reddedilen bir XML özniteliği kimin oluşturduğunu sorduğundan oylama reddedildi. Bir XML öğesi üretmiyor. –

6

Ne yazık ki (& garip) bu linke http://connect.microsoft.com/VisualStudio/feedback/details/277641/xmlattribute-xmltext-cannot-be-used-to-encode-types-implementing-ixmlserializable

göre mümkün değildir işle etrafında için sorun, Şu anda karmaşık özellik gizlemek ve başka özellik aracılığıyla bir dize olarak maruz XmlIgnore özelliğini kullanıyorum

public class MyDto 
{ 
    [XmlAttribute(AttributeName = "complex-attribute")] 
    public string MyComplexPropertyAsString 
    { 
     get { return MyComplexMember.ToString(); } 
     set { MyComplexMember.LoadFromString(value); } 
    } 
    [XmlIgnore] 
    public MyComplexMember At { get; set; } 
} 
İlgili konular