2015-08-13 63 views
1

我使用此代碼有一點與Bond反序列化XML拋出System.IO.InvalidDataException:意外節點類型

using System; 
using System.IO; 
using System.Text; 
using System.Xml; 
using Bond; 
using Bond.Protocols; 
using NUnit.Framework; 

public class Sandbox 
{ 
    [Test] 
    public void RoundtripWithSchema() 
    { 
     var sb = new StringBuilder(); 
     var source = new WithSchema { Value = 1 }; 

     using (XmlWriter xmlWriter = XmlWriter.Create(sb)) 
     { 
      var writer = new SimpleXmlWriter(xmlWriter); 
      Serialize.To(writer, source); 
     } 
     var xml = sb.ToString(); 
     Console.Write(xml); 
     Console.WriteLine(); 

     using (var xmlReader = XmlReader.Create(new StringReader(xml))) 
     { 
      var reader = new SimpleXmlReader(xmlReader); 
      var roundtripped = Deserialize<WithSchema>.From(reader); // System.IO.InvalidDataException : Unexpected node type 
      Assert.AreEqual(source.Value, roundtripped.Value); 
     } 
    } 

    [Test] 
    public void RoundtripUsingSerializerWithSchema() 
    { 
     var sb = new StringBuilder(); 
     var source = new WithSchema { Value = 1 }; 

     using (XmlWriter xmlWriter = XmlWriter.Create(sb)) 
     { 
      var writer = new SimpleXmlWriter(xmlWriter); 
      var serializer = new Serializer<SimpleXmlWriter>(typeof(WithSchema)); 
      serializer.Serialize(source, writer); 
     } 
     var xml = sb.ToString(); 
     Console.Write(xml); 
     Console.WriteLine(); 

     using (var xmlReader = XmlReader.Create(new StringReader(xml))) 
     { 
      var reader = new SimpleXmlReader(xmlReader); 
      var serializer = new Deserializer<SimpleXmlReader>(typeof(WithSchema)); 
      var roundtripped = serializer.Deserialize<WithSchema>(reader); // System.IO.InvalidDataException : Unexpected node type 
      Assert.AreEqual(source.Value, roundtripped.Value); 
     } 
    } 
} 

[Schema] 
public class WithSchema 
{ 
    [Id(0)] 
    public int Value { get; set; } 
} 

兩個樣品輸出期望的XML:

<?xml version="1.0" encoding="utf-16"?> 
<WithSchema> 
    <Value>1</Value> 
</WithSchema> 

都失敗當反序列化投擲System.IO.InvalidDataException:意外的節點類型

不知道在哪裏尋找錯誤真的,建議?

回答

1

債券SimpleXmlReader<?xml version="1.0" encoding="utf-16"?>行有問題。如果你在序列化的時候把這個放在外面,你可以反序列化而不會出問題。

嘗試這樣的事情

using (XmlWriter xmlWriter = XmlWriter.Create(sb, new XmlWriterSettings { OmitXmlDeclaration = true })) 
{ 
    var writer = new SimpleXmlWriter(xmlWriter); 
    Serialize.To(writer, source); 
} 

我的猜測是,XmlNodeType.XmlDeclaration可能需要被添加到邦德的SimpleXmlParserIgnoredTokens集。

修復版本晚於v4.0.1的債券版本將會出現此問題(債券問題#112在GitHub上)。

靈感來自這個答案來自Bond simple_xml sample