2013-05-14 56 views
1

我使用的是XmlSerializer.SerializeXmlSerializer.Deserialize 我有一個類MetricResult:反序列化,列出

public class Metricresult 
{ 
     public string metric; 
     public string newvalue; 
     public string deltavalue; 

} 

,我計算了一定的成果將存儲在:

List<Metricresult> metricresults = new List<Metricresult>(); 

我改變了這個列表到XML文件成功,在另一個項目中,我需要反序列化這個列表,但有一個異常拋出:

there-is-an-error-in-xml-document-0-0-during-deserialization 

XML文件


<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfMetricresult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Metricresult> 
    <metric>numberofdeclaration</metric> 
    <newvalue>0</newvalue> 
    <deltavalue>0</deltavalue> 
    </Metricresult> 
    <Metricresult> 
    <metric>numberofdeclaration</metric> 
    <newvalue>0</newvalue> 
    <deltavalue>0</deltavalue> 
    </Metricresult> 
    <Metricresult> 
    <metric>numberofdeclaration</metric> 
    <newvalue>0</newvalue> 
    <deltavalue>0</deltavalue> 
    </Metricresult> 
    <Metricresult> 
    <metric>numberofdeclaration</metric> 
    <newvalue>0</newvalue> 
    <deltavalue>0</deltavalue> 
    </Metricresult> 
    <Metricresult> 
    <metric>numberofdeclaration</metric> 
    <newvalue>0</newvalue> 
    <deltavalue>0</deltavalue> 
    </Metricresult> 
    <Metricresult> 
    <metric>numberofdeclaration</metric> 
    <newvalue>0</newvalue> 
    <deltavalue>0</deltavalue> 
    </Metricresult> 
</ArrayOfMetricresult> 
+0

您能發佈XML文件的確切內容嗎? – 2013-05-14 08:47:48

+0

顯示序列化/反序列化代碼 – 2013-05-14 08:49:47

+0

是的,序列化的數據看起來是這樣的...必須是您的反序列化代碼中的錯誤。 – 2013-05-14 08:56:24

回答

3

奇怪,怎麼以下作品完美的罰款對我來說:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml; 
using System.Xml.Serialization; 

public class MetricResult 
{ 
    public string Metric { get; set; } 
    public string NewValue { get; set; } 
    public string DeltaValue { get; set; } 

} 

class Program 
{ 
    static void Main() 
    { 
     // define some metric results to serialize 
     var metricResults = new[] 
     { 
      new MetricResult { Metric = "metric 1", NewValue = "new value 1", DeltaValue = "delta 1" }, 
      new MetricResult { Metric = "metric 2", NewValue = "new value 2", DeltaValue = "delta 2" }, 
      new MetricResult { Metric = "metric 3", NewValue = "new value 3", DeltaValue = "delta 3" }, 
     }.ToList(); 
     var serializer = new XmlSerializer(metricResults.GetType()); 

     using (var writer = XmlWriter.Create("metrics.xml")) 
     { 
      // serialize the metric results we defined previously to metrics.xml 
      serializer.Serialize(writer, metricResults); 
     } 

     using (var reader = XmlReader.Create("metrics.xml")) 
     { 
      // read metrics.xml and deserialize back 
      metricResults = (List<MetricResult>)serializer.Deserialize(reader); 
      foreach (var result in metricResults) 
      { 
       Console.WriteLine("metric: {0}, new value: {1}, delta: {2}", result.Metric, result.NewValue, result.DeltaValue); 
      } 
     } 
    } 
} 

metrics.xml看起來預期:

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfMetricResult xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <MetricResult> 
    <Metric>metric 1</Metric> 
    <NewValue>new value 1</NewValue> 
    <DeltaValue>delta 1</DeltaValue> 
    </MetricResult> 
    <MetricResult> 
    <Metric>metric 2</Metric> 
    <NewValue>new value 2</NewValue> 
    <DeltaValue>delta 2</DeltaValue> 
    </MetricResult> 
    <MetricResult> 
    <Metric>metric 3</Metric> 
    <NewValue>new value 3</NewValue> 
    <DeltaValue>delta 3</DeltaValue> 
    </MetricResult> 
</ArrayOfMetricResult> 
+0

heh;不僅僅是我不能忽略一個'public string newvalue;',那麼呢? ; p雖然爲了保留原始數據佈局(主要是OP的註釋,而不是Darin),您需要在屬性前添加[[XmlElement(「newvalue」)]''。 – 2013-05-14 08:56:39

+0

@Darin Dimitrov謝謝 – gasroot 2013-05-14 09:34:30

+0

@Ammaedragas @我們能問一下你的代碼中破解了什麼?既然這可能有助於下一個讀者在谷歌等發現它? – 2013-05-14 09:37:23

1

0,0處的錯誤通常意味着在第一個元素之前,在xml文件的開始處有空白。仔細看看xml(也許看看二進制文件,而不是文本 - 它也可能是unicode無形空間等)。

另外:只要使用XmlSerializer,看InnerException S:

catch(Exception ex) { 
    while(ex != null) { 
     Trace.WriteLine(ex.Message); 
     ex = ex.InnerException; 
    } 
} 

通常有很詳細的解釋,如果你看一下所有的方式通過的消息。

人們做出的一個非常常見的錯誤是使用流時,不倒帶它們。下面的錯誤將會出現一個0,0錯誤:

using (var ms = new MemoryStream()) 
    { 
     serializer.Serialize(ms, metricResults); 
     serializer.Deserialize(ms); 
    } 

因爲serialize離開了流的結尾。如果您有這樣的代碼,請將流重置爲序列化和反序列化之間的開始(ms.Position = 0;)。另請參閱:How many ways can you mess up IO?

+0

在開始時可能是BOM嗎? – 2013-05-14 08:57:27

+0

@MatthewWatson可能,但*大部分時間BOM正確處理。要知道的唯一方法是看到數據的反序列化代碼和*二進制* – 2013-05-14 09:01:33

+0

謝謝@MarcGravell – gasroot 2013-05-14 09:33:43