错误反序列化XML到对象 - 的xmlns =''是没有预料到预料、对象、错误、序列化

2023-09-02 10:28:04 作者:指尖残余的微凉﹏

我有真正的麻烦试图反序列化一些XML,并希望有人能提供一些帮助。我读了很多类似的帖子,但我无法解决这个问题。

XML我试图反序列化

 <注册账号成功=假>
  <使用者名称>为XXXXX< /用户名称>
  <密码> fghgh< /密码>
  &LT;电子邮件&GT; test@example.com< /电子邮件&GT;
  &LT;错误&GT;
    &LT;错误code&GT; 120℃/错误code取代;
    &LT; errormessage的&gt;该密码是无效的&LT; / errormessage的&GT;
  &LT; /错误&GT;
&LT; /注册帐户&GT;
 

类我试图反序列化到:

  [Serializable接口,XmlRoot(的ElementName =注册账户,命名空间=myNameSpace对象)]
[XmlType将(注册账户)]
公共类RegisterAccountResponse
{
    [XmlAttribute(成功)
    公共BOOL成功{获得;组; }

    ///&LT;总结&gt;
    ///获取或设置坦电子邮件地址
    ///&LT; /总结&gt;
    [的XmlElement(电子邮件)
    公共字符串电子邮件{获得;组; }

    ///&LT;总结&gt;
    ///获取或设置坦密码
    ///&LT; /总结&gt;
    [的XmlElement(密码)
    公共字符串密码{获得;组; }

    ///&LT;总结&gt;
    ///获取或设置用户名坦
    ///&LT; /总结&gt;
    [的XmlElement(用户名)]
    公共字符串的用户名{获得;组; }

    ///&LT;总结&gt;
    有关该RegisterAccountRequest ///租客门户网站错误
    ///&LT; /总结&gt;
    [的XmlElement(错误)
    公共QubeError错误;
}
 

反序列化方法

 公共静态牛逼反序列化&LT; T&GT;(字符串数据),其中T:类
    {
        如果(数据== NULL)
        {
            返回null;
        }

        如果(data.Trim()。长度== 0)
        {
            返回null;
        }

        VAR SER =新的XmlSerializer(typeof运算(T));

        使用(VAR SR =新StringReader(数据))
        {
            返程(T)ser.Deserialize(SR);
        }
    }
 
c 正反序列化XML文件示例 xml序列化

反序列化方法调用

  VAR数据= Helper.Deserialize&LT; RegisterAccountResponse&GT;(XML);
 

例外:

  

有一个在XML文档(误差1,   2)。 --->   System.InvalidOperationException:是   预计不会。在   Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data()

内部异常,如下所示:

 &LT;注册帐户的xmlns =''&GT;是没有预料到。
 

解决方案

简单地脱掉命名空间=

  [XmlRoot(注册账户),XmlType将(注册账户)]
公共类RegisterAccountResponse {...}
 

因为你的XML似乎并不在一个XML命名空间。此外, [Serializable接口] 不使用的XmlSerializer

如果你的XML是使用一个命名空间,将有一个的xmlns 在根目录下。

此外,以帮助来电者可以添加其中T:类,新的()(即,新的()正在增加),以你的反序列化方法,因为的XmlSerializer 需要一个公共的无参数的构造函数。

I am having real trouble trying to deserialize some XML and was hoping someone can offer some assistance. I have read a lot of similar posts but I am unable to resolve this.

XML I am attempting to deserialize

<register-account success="false">
  <user-name>xxxxx</user-name>
  <password>fghgh</password>
  <email>test@example.com</email>
  <error>
    <errorcode>120</errorcode>
    <errormessage>The password is invalid</errormessage>
  </error>
</register-account>

Class I am trying to deserialize to:

[Serializable, XmlRoot(ElementName = "register-account", Namespace = "MyNamespace")]
[XmlType("register-account")]
public class RegisterAccountResponse
{
    [XmlAttribute("success")]
    public bool Success { get; set; } 

    /// <summary>
    /// Gets or sets the Tennant email address
    /// </summary>
    [XmlElement("email")]
    public string Email { get; set; }

    /// <summary>
    /// Gets or sets the tennant password
    /// </summary>
    [XmlElement("password")]
    public string Password { get; set; }

    /// <summary>
    /// Gets or sets the Tennant username
    /// </summary>
    [XmlElement("user-name")]
    public string Username { get; set; }

    /// <summary>
    /// A Tenant Portal error relating to the RegisterAccountRequest
    /// </summary>
    [XmlElement("error")]
    public QubeError Error;
}

Deserialization Method

    public static T Deserialize<T>(string data) where T : class
    {
        if (data == null)
        {
            return null;
        }

        if (data.Trim().Length == 0)
        {
            return null;
        }

        var ser = new XmlSerializer(typeof(T));

        using (var sr = new StringReader(data))
        {
            return (T)ser.Deserialize(sr);
        }
    }

Deserialization Method Call

var data = Helper.Deserialize<RegisterAccountResponse>(xml);

Exception:

There is an error in XML document (1, 2). ---> System.InvalidOperationException: was not expected. at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data()

Inner Exception as follows:

<register-account xmlns=''> was not expected.

解决方案

Simply take off the Namespace =:

[XmlRoot("register-account"), XmlType("register-account")]
public class RegisterAccountResponse {...}

since your xml doesn't seem to be in an xml-namespace. Also, [Serializable] isn't used by XmlSerializer.

If your xml was using a namespace it would have an xmlns at the root.

Also, to help with callers you could add where T : class, new() (the , new() being the addition) to your Deserialize method, since XmlSerializer demands a public parameterless constructor.