2009-11-13 15 views
14

基本クラスから継承するクラスをXMLにシリアル化することができました。XmlSerializerが継承した型のxsi:typeを出さないようにする

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

これは、しかし、チョークとになるエラーを生成するために、Webサービスの受信側が発生します:しかし、.NETのXmlSerializerは、次のようなXML要素を生成し申し訳ありません、我々は知りません」 DerivedType "

XmlSerializerでxsi:Type属性が表示されないようにするにはどうすればよいですか?ありがとう!あなたが本当に完全にtype属性を削除したい場合は、あなたが書いたときに、属性をスキップしますあなた自身てXmlTextWriterを書くことができ

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

//produces 

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

答えて

17

あなたは、type属性に別の値を指定するXmlType attributeを使用することができます(inspired by 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

素晴らしい!リュックはとても感謝しています。 –

関連する問題