次の問題が発生しています。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
が欠落していることがわかります。xsd
xsi
OuterCustom
と同じように動作させるにはどうすればよいOuter
ですか? コードに何か不足していますか? カスタムのシリアル化を間違っていますか?
追加の名前空間を削除する方法についてSO で多くの質問がありますが、それらを元に戻す方法については誰も質問していないようです。