2009-11-13 6 views
14

miras türlerinde türü.önle XmlSerializer: Ben XML bir temel sınıf devralan bir sınıf seri hale başarmış

<BaseType xsi:Type="DerivedType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

Ancak bu, boğmak ve tutarındaki bir hata üretmek için bir web hizmeti alma ucunu neden olur: Ancak, .NET XmlSerializer şöyle bakar bir XML elemanı üreten üzgün olduğunu bilmiyoruz " DerivedType".

XmlSerializer'ın xsi: Type özniteliğini yaymasını nasıl engelleyebilirim? Teşekkürler! Gerçekten tamamen türü özelliğini kaldırmak isterseniz

[XmlType("foo")] 
public class DerivedType {...} 

//produces 

<BaseType xsi:type="foo" ...> 

, sen yazarken niteliğini atlayacak kendi XmlTextWriter, yazabilir:

cevap

17

type özelliğinin için başka bir değer belirtmek için XmlType attribute kullanabilirsiniz (esinlenen: this blog entry):

public class NoTypeAttributeXmlWriter : XmlTextWriter 
{ 
    public NoTypeAttributeXmlWriter(TextWriter w) 
       : base(w) {} 
    public NoTypeAttributeXmlWriter(Stream w, Encoding encoding) 
       : base(w, encoding) { } 
    public NoTypeAttributeXmlWriter(string filename, Encoding encoding) 
       : base(filename, encoding) { } 

    bool skip; 

    public override void WriteStartAttribute(string prefix, 
              string localName, 
              string ns) 
    { 
     if (ns == "http://www.w3.org/2001/XMLSchema-instance" && 
      localName == "type") 
     { 
      skip = true; 
     } 
     else 
     { 
      base.WriteStartAttribute(prefix, localName, ns); 
     } 
    } 

    public override void WriteString(string text) 
    { 
     if (!skip) base.WriteString(text); 
    } 

    public override void WriteEndAttribute() 
    { 
     if (!skip) base.WriteEndAttribute(); 
     skip = false; 
    } 
} 
... 
XmlSerializer xs = new XmlSerializer(typeof(BaseType), 
            new Type[] { typeof(DerivedType) }); 

xs.Serialize(new NoTypeAttributeXmlWriter(Console.Out), 
      new DerivedType()); 

// prints <BaseType ...> (with no xsi:type) 
+1

harika! Çok takdir Luc. –

İlgili konular