无法在<string> C# 中将字符串数组反序列化回列表



我已经看到这个问题被问到,但没有找到有效的答案,所以我再问一次。我有一个带有 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);
        }
     }

相关内容

  • 没有找到相关文章

最新更新