【问题标题】:Incorrect XML deserialization不正确的 XML 反序列化
【发布时间】:2014-12-03 23:43:35
【问题描述】:

我有以下课程:

public class FtpDefinition
{
    public FtpDefinition()
    {
        Id = Guid.NewGuid();
        FtpServerAddress = string.Empty;
        FtpPortSpecified = false;
        FtpPort = "21";
    }

    [System.Xml.Serialization.XmlElement("Id")]
    public System.Guid Id { get; set; }

    [System.Xml.Serialization.XmlElement("FtpServerAddress")]
    public string FtpServerAddress { get; set; }

    [System.Xml.Serialization.XmlElement("FtpPortSpecified")]
    public bool FtpPortSpecified  { get; set; }

    [System.Xml.Serialization.XmlElement("FtpPort")]
    public string FtpPort { get; set; }
}

我有一个方法可以获取以下 XML 字符串,并使用 .net XML 反序列化功能 将其反序列化为 FtpDefinition 类型的对象。

<FTPDefinition>
  <Id>a0a940a7-6785-41be-ac3a-75ba5d4c13ee</Id>
  <FtpServerAddress>ftp.noname.com</FtpServerAddress>
  <FtpPortSpecified>false</FtpPortSpecified>
  <FtpPort>21</FtpPort>
</FTPDefinition>

问题是,虽然 Id 和 FtpServerAddress 字段得到正确填充,但 FtpPort 得到 填充了一个空字符串,更奇怪的是 FtpPortSpecified 填充了布尔值 TRUE 而不是 FALSE。

我用实际的 return\... = value 旧式 getter\setter 替换了上面代码中的自动属性,这样我就可以捕捉到 setter 被击中。我怀疑有一些用户代码设置了该值,但事实并非如此。在调用堆栈中,它清楚地表明 .net 反序列化代码正在调用值为 TRUE 的设置器,但也可以看到作为反序列化方法的参数提供的 XML 字符串具有正确的值 (FALSE)。

反序列化代码很简单:

XmlSerializer xs =  ...(objectType);

using (StringReader stringReader = new StringReader(xml))
{
    return xs.Deserialize(stringReader);
}

请帮我弄清楚发生了什么。

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 在 ctor 中,您使用属性 PortSpecified 它的定义在哪里?我只看到 FtpPortSpecified
  • 已修复。创建问题时出现复制粘贴错误。

标签: c# .net xml xml-serialization xmlserializer


【解决方案1】:

Specified 后缀在 XML 序列化中有一些特殊的行为。只需将FtpPortSpecified 更改为其他内容即可。
http://msdn.microsoft.com/en-us/library/office/bb402199(v=exchg.140).aspx

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多