【发布时间】:2018-10-07 10:07:52
【问题描述】:
为什么 XmlSerializer 在使用他的阅读器时会中止阅读?
示例 XML - here -。
下载示例项目- here -。
当使用XmlSerializer 时,该类可以被序列化和反序列化。
var serializer = new XmlSerializer(typeof(MainItem));
using (var reader = new StreamReader(SettingFile.FullName))
{
var deserializedObject = serializer.Deserialize(reader);
ret = (MainItem)deserializedObject;
}
要序列化的模型
public class MainItem
{
public List<Child1> Child1{ get; set; }
}
在ConnectionModel 中,我有一个自定义类,我从 XmlSerializer 获取 XmlReader 以自定义方式反序列化。这是通过在我的类中实现接口IXmlSerializable 来完成的。
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
reader.Read(); // <-- as soon as I comment this out, the serializer will finish proper!
}
public void WriteXml(XmlWriter writer)
{
writer.WriteStartElement(nameof(PropertyInfo.Name));
writer.WriteString(Value.Name);
writer.WriteEndElement();
writer.WriteStartElement(nameof(PropertyInfo.PropertyType));
writer.WriteString(Value.PropertyType.Name);
writer.WriteEndElement();
writer.WriteStartElement(XML_PropertyTypeFullName);
writer.WriteString(Value.PropertyType.FullName);
writer.WriteEndElement();
writer.WriteStartElement(nameof(PropertyInfo.CanRead));
writer.WriteString(Value.CanRead.ToString());
writer.WriteEndElement();
writer.WriteStartElement(nameof(PropertyInfo.CanWrite));
writer.WriteString(Value.CanWrite.ToString());
writer.WriteEndElement();
}
reader.Read() 根本不会抛出任何异常。它会将值正确读入模型,但为了测试,我全部注释掉了,除了reader.Read() 的这一行。它在文件中间的调试窗口中显示?XmlTextReader(reader).LineNumber,而不是EOF。如果reader.Read()正在使用中(未注释掉),它将读取一个项目而不是下一个项目。
System.Xml.Serialization.XmlSerializer和IXmlSerializable结合使用有什么要注意的吗?
【问题讨论】:
-
最可能的原因是你没有implement
IXmlSerializablecorrectly。如果您没有严格按照说明进行操作,XmlReader将被错误定位,随后的元素将被跳过,或者反序列化将中止。需要一个 minimal reproducible example 包括 XML 来确定。例如,如果有 end 元素,您可能忘记使用 end 元素。 -
正确实现
IXmlSerializable的示例,请参见Proper way to implement IXmlSerializable?和Deserializing collection of types implementing IXmlSerializable runs forever。我更喜欢在ReadXml()中使用xmlReader.ReadSubtree()或XNode.ReadFrom(reader),如第二个链接所示,因为使用其中任何一种都不太可能使XmlReader定位错误。 -
已验证 XML。你可以在这里看到它:t78.ch/i?q=39
-
在项目描述中添加了一个完整的VisualStudio示例项目以供下载。
标签: c# .net xml-serialization xmlserializer