2013-05-14 75 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