我有下面的类:不正确的XML序列化
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填充。
我用上面的代码中的自动属性替换为实际返回值... ... = value旧样式getter \ setter,这样我就可以捕捉到setter被击中了。我怀疑有一些用户代码设置值,但事实并非如此。在调用堆栈中,它清楚地表明.net反序列化代码正在调用值为TRUE的setter,但也可以看到,作为反序列化方法的参数提供的XML字符串具有正确的值(FALSE)。
反序列化的代码很简单:
XmlSerializer xs = ...(objectType);
using (StringReader stringReader = new StringReader(xml))
{
return xs.Deserialize(stringReader);
}
请帮我弄清楚是怎么回事。
我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2014-12-04 00:00:13
在ctor中你使用属性PortSpecified在哪里def它?我只看到FtpPortSpecified – 2014-12-04 00:02:42
修正了它。我创建问题时复制粘贴错误。 – user181218 2014-12-04 00:12:02