麻烦与XmlSerialzier中的评论

Dav*_*Dav 5 c# .net-4.0 xml-comments xmlserializer

我尝试使用以下代码加载XML文件:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyObject));
StreamReader reader = new StreamReader(fileName);
object myobject = xmlSerializer.Deserialize(reader);
Run Code Online (Sandbox Code Playgroud)

当文件包含这样的评论时:

<?xml version="1.0" encoding="utf-8"?>
<!-- edited with XMLSpy v2007 sp2  -->
<route>
    <!--File created on 26-Nov-2010 12:36:42-->
    <file_content>1
    <!--0 = type1 ; 1 = type2-->
    </file_content>
</route>
Run Code Online (Sandbox Code Playgroud)

XmlSerializer返回一个错误,如

意外的节点类型注释.只能在具有简单或空内容的元素上调用ReadElementString方法

当我在文件中删除此注释时,它工作正常.

我不知道问题出在哪里,有什么想法吗?

mmi*_*mix 5

正如您所看到的,序列化XML中不允许使用注释,但这应该对您没有任何问题.您可能无法控制源XML但控制反序列化过程,因此只需在反序列化之前删除所有注释:

    XmlSerializer xmlSerializer = new XmlSerializer(typeof(myobject));

    // load document
    XmlDocument doc = new XmlDocument();
    doc.Load(filename);

    // remove all comments
    XmlNodeList l = doc.SelectNodes("//comment()");
    foreach (XmlNode node in l) node.ParentNode.RemoveChild(node);

    // store to memory stream and rewind
    MemoryStream ms = new MemoryStream();
    doc.Save(ms);
    ms.Seek(0, SeekOrigin.Begin);

    // deserialize using clean xml
    xmlSerializer.Deserialize(XmlReader.Create(ms));
Run Code Online (Sandbox Code Playgroud)

如果您的对象很大并且您在短时间内对其中的大量对象进行反序列化,那么我们可以调查一些框架外的快速Xpath读取器.