我已经看到这个问题被问到,但没有找到有效的答案,所以我再问一次。我有一个带有 POST 方法的 restful Web 服务,该方法返回序列化列表。
<ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<string>QoL5vA8OKgydWIn%2fdWiu70nobBrJo4N9iXeHmtM7Aj4%3d</string>
<string>vxHyJiSSSvDSZWXOdcfl5FMQC97xxGEWDO8Zy8Qp3X5CwADUbEE8ifACQHR1n7uamEaIUbf85ZuBDB8FFCNY2tJAMJ2jNw09SqGVTpMU5uI06DLtuYnJqsPIF735NOhlvRhBLPnpp62DFMCVsDNHy55UBF3Ggi06ZWTiJ8LTYIf3FYiFLPpXLZ1wWeE5chAWQGfz7zDYJa1OgSZ</string>
<string>OqGAT7Yqe6DfyVD29BeIXFyGtabVCloaC9FA1Fp20JkJ9T17ZzyqhnGxwWda7FqqyJUM8YK9OdcOCgTYrl4JxalECdtJm75TdSG8IAPQlFHp6Gidg4EwZaO9FKahlYMm5JrFpxTmLrdLgMAkYEV7gIR6zIyIByAGwYYDDwH3QCHrym3CuueRnFWAHCJu1LJbx0zRtt7g3yEaTiJ</string>
</ArrayOfstring>
执行调用的代码如下所示。
XDocument xDocResponse = RestPOSTToXDocument(szBaseUri, szInput);
string szNamespace = xDocResponse.Root.Name.Namespace.ToString();
IXmlUtils utility = new XmlUtils();
List<string> lst = utility.DeserializeList<string>(xDocResponse, szNamespace);
我还尝试了不同版本的调用,如下所示。
List<List<string>> lst = utility.DeserializeList<List<string>>(xDocResponse, szNamespace);
两个版本的调用都会生成下面提供的错误。
System.XML 中发生类型为"System.InvalidOperationException"的异常.dll但未在用户代码中处理其他信息:XML 文档中存在错误 (0, 0)。
下面提供了我的反序列化方法。
public List<T> DeserializeList<T>(XDocument doc, string szNamespace)
{
List<T> result = null;
XmlSerializer serializer = new XmlSerializer(typeof(List<T>), szNamespace);
using (System.Xml.XmlReader reader = doc.CreateReader())
{
result = (List<T>)serializer.Deserialize(reader);
}
return result;
}
XDocument 中的 XML 是有效的,所以我不明白为什么会生成此错误。此外,即使我尝试通过 XDocument 中的导航获取元素,它也不起作用。 如果我看文档。Root.value,似乎所有字符串都连接成一个字符串。
有没有人知道如何将这个XDocument反序列化为列表?
多亏了mellamokb的帮助,我发现了问题。 当我的列表被序列化时,它被序列化为一个 ArrayOfstring。 如果我采用XML并将ArrayOfstring替换为ArrayOfString,则反序列化有效。
这没有多大意义。 我欢迎解释为什么这是必要的,尽管它可能与字符串与字符串有关。
基本上,我必须执行以下操作:
string szXml = xDocResponse.ToString();
int nEndRoot = szXml.IndexOf(">");
szXml = szXml.Replace("ArrayOfstring", "ArrayOfString");
xDocResponse = utility.LoadXDocument(szXml);
string szNamespace = xDocResponse.Root.Name.Namespace.ToString();
List<string> lst = utility.DeserializeList<string>(xDocResponse, szNamespace);
只需获取响应流并解散到字符串数组中并将其存储到 List
代码片段:
List<string> listNew=new List<string>();
using (Stream answer = webResponse.GetResponseStream())
{
DataContractSerializer xmlSer = new DataContractSerializer(typeof(string[]));
var stringArr= (string[])xmlSer.ReadObject(answer);
foreach (string item in GenreList)
{
listNew.Add(item);
}
}