2012-11-01 32 views
0

我有一个REST服务返回包含int列表的序列化对象的XML。目标代码是下面反序列化包含int列表的对象

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

namespace All.Tms.Dto 
{ 
    [XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/All.Tms.Dto")] 
    public class ReadSensorsForVehicleIdResponse 
    { 
     public List<int> sensorIdList { get; set; } 
    } 
} 

当该对象被序列生成并发送作为XML:

<ReadSensorsForVehicleIdResponse xmlns="http://schemas.datacontract.org/2004/07/All.Tms.Dto"  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><sensorIdList xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:int>107</a:int></sensorIdList></ReadSensorsForVehicleIdResponse> 

的问题是,整型值被序列化为

<a:int>107</a:int> 

这会导致对象的反序列化失败。当我改变

<a:int>107</a:int> 

<int>107</int> 

对象反序列化正确。是否有任何理由为什么int值以这种方式序列化,我该如何解决这个问题?

下面是我用它来反序列化

public static T Deserialize<T>(string xml) where T : class 
    { 
     var serializer = new XmlSerializer(typeof(T)); 

     var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)); 

     var reader = XmlReader.Create(stream); 

     return (T)serializer.Deserialize(reader); 
    } 

回答

2

Linq To Xml易于使用

var xDoc = XDocument.Parse(xmlstring); //or XDocument.Load(fileName) 
XNamespace ns = "http://schemas.microsoft.com/2003/10/Serialization/Arrays"; 

var a = xDoc.Descendants(ns + "int") 
      .Select(x => (int)x) 
      .ToList(); 
+0

我在上面的问题中添加了用于反序列化的代码。此代码在整个项目中都会使用,并且需要付出很大的努力才能使用您建议的方法将我的对象更改为反序列化。 – user65439

+0

我实现了你建议的解决方案,反序列化我遇到麻烦的对象。感谢您的建议。 +1 – user65439

3

这是正在应用

xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" 

您将需要反序列化过程中占据了命名空间的XML命名空间的代码。

+0

我如何做到这一点上面给出的对象类。我不认为xmlns:a =“http://schemas.microsoft.com/2003/10/Serialization/Arrays”是问题所在。正如我所说,当我删除int标记中的'a:'字符时,对象反序列化很好。 – user65439

+0

正在添加a,因为该名称空间正在应用于整数。 xmlns:a 你如何试图反序列化? –

+0

我添加了我用于反序列化的代码,以上面我的问题 – user65439