0

次の問題が発生しています。C# クラスで既定の XML シリアル化を使用すると、名前空間xsiと名前空間xsdが .NET シリアル化エンジンによって自動的に追加されます。ただし、シリアライゼーションが で定義されているIXmlSerializable場合、ネームスペースは追加されません。

例: このコード:

class Program
{
    static void Main(string[] args)
    {
        OutputSerialized(new Outer() { Inner = new Inner() });
        OutputSerialized(new OuterCustom() { Inner = new Inner() });
    }

    static void OutputSerialized<T>(T t)
    {
        var sb = new StringBuilder();
        using (var textwriter = new StringWriter(sb))
            new XmlSerializer(typeof(T)).Serialize(textwriter, t);
        Console.WriteLine(sb.ToString());
    }
}

[Serializable] public class Inner { }

[Serializable] public class Outer { public Inner Inner { get; set; } }

public class OuterCustom : IXmlSerializable
{
    public Inner Inner;

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteStartElement("Inner");
        new XmlSerializer(typeof(Inner)).Serialize(writer, Inner);
        writer.WriteEndElement();
    }

    public System.Xml.Schema.XmlSchema GetSchema() { return null; }
    public void ReadXml(System.Xml.XmlReader reader) { /**/ }
}

次の出力が生成されます。

<?xml version="1.0" encoding="utf-16"?>
<Outer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Inner />
</Outer>
<?xml version="1.0" encoding="utf-16"?>
<OuterCustom>
  <Inner>
    <Inner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
  </Inner>
</OuterCustom>

のシリアル化された形式にと名前空間OuterCustomが欠落していることがわかります。xsdxsi

OuterCustomと同じように動作させるにはどうすればよいOuterですか? コードに何か不足していますか? カスタムのシリアル化を間違っていますか?

追加の名前空間を削除する方法についてSO で多くの質問がありますが、それらを元に戻す方法については誰も質問していないようです。

4

1 に答える 1