【发布时间】: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