我有一个XSD架构,包括一些"简单"零件和更多"复杂"部件(它们不能使用框架属性以正确的方式序列化)。我使用.Net序列化器来处理简单的部件,并通过在内部对象上实现IXmlSerializable
接口为更复杂的部件编写自定义序列化器。
当我测试代码时,我只输出" custom"部分反序列化(阅读时)。如果我在" root"上注释引用复杂对象的属性。 class,然后所有简单的序列化发生(读和写)。它接缝表示手工序列化器对序列化进行了所有控制,而不是仅按需要序列化内部对象。在我看来这是一种奇怪的行为,所以bug在哪里?
是否可以仅在内部对象上使用IXmlSerializable?
这是" root" class:
public class RootElement
{
[XmlAttribute("foo")]
public Foo foo;
[XmlAttribute("bar")]
public Bar? bar;
public bool ShouldSerializeBar()
{
return bar.ShouldSerialize;
}
[XmlElement("SimpleXml")]
public SimpleXml simpleXml;
// commenting these two lines radically change the serialization
[XmlElement("ComplexXmlWithCustomSerializer")]
public ComplexXml complexXml;
}
结束这是" ComplexXml"类
public class ComplexXml : IXmlSerializable
{
public double pty1;
public double? pty2;
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
XmlReader reader2 = reader.ReadSubtree();
while (reader2.Read())
{
if (reader2.NodeType == XmlNodeType.Element)
{
string unit;
switch (reader2.Name)
{
case "Pty1":
unit = reader2.GetAttribute("unit");
if (string.Equals(unit, "mm"))
pty1 = double.Parse(reader2.GetAttribute("value"));
break;
case "Pty2":
unit = reader2.GetAttribute("unit");
if (string.Equals(unit, "deg"))
pty2 = double.Parse(reader2.GetAttribute("value"));
break;
}
}
if (reader2.NodeType == XmlNodeType.EndElement)
reader2.ReadEndElement();
}
}
public void WriteXml(XmlWriter writer)
{
//pty1
writer.WriteStartElement("Pty1");
writer.WriteAttributeString("unit", "mm");
writer.WriteAttributeString("value", pty1.ToString());
writer.WriteEndElement();
//pty2
if (pty2.HasValue)
{
writer.WriteStartElement("Pty2");
writer.WriteAttributeString("unit", "deg");
writer.WriteAttributeString("value", WrapAngle.Value.ToString());
writer.WriteEndElement();
}
}
}
答案 0 :(得分:0)
我可以在类似的问题here中找到这个问题的答案。
重点是用
结束ReadXml(XmlReader reader)
方法
reader.Read();
我不明白它为什么会起作用,但是这一行使读者能够在自定义方法结束后继续读取XML文档......