我遇到以下问题。每当我在我的C#类中使用默认的XML序列化时,.NET序列化引擎会自动添加名称空间xsi
和xsd
。但是,当通过IXmlSerializable
定义序列化时,不会添加名称空间。使用自定义IXmlSerializable时缺少xsi和xsd名称空间
实施例:此代码:
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有关如何摆脱额外的命名空间的很多问题,但似乎没有人问如何让他们回来。
从XML的观点来看,2个XML样本没有区别...您是否试图对XML进行一些字符串/正则表达式搜索? –
@Alexei Levenkov:嗯,我试图美化XML输出:在实际的代码中,我有很多'Inner'类,每个类都包含额外的名称空间(这看起来很丑陋)。无论如何,我想知道为什么XML序列化程序在两种情况下做了不同的事情,它们似乎是“相同的”。 – Vlad
你有没有试过用'WriteAttributeString](http://msdn.microsoft.com/en-us/library/73z46xs1%28v=vs.110%29.aspx)在'OuterCustom'上手动编写xmlns属性? –