gpt4 book ai didi

c# - 反序列化和构造函数关系

转载 作者:数据小太阳 更新时间:2023-10-29 03:01:49 24 4
gpt4 key购买 nike

我不知道为什么我不能在网上找到一个简单的快速查找,但我想知道反序列化一个对象的 XML 表示和该对象的构造函数之间的关系是什么?

我假设它使用默认构造函数。如果是这种情况,它将在构造函数中运行代码,但之后不会更新对象本身以反射(reflect) XML?

这里有更多关于我的意思的上下文......

我有一个对象,它有两个实际上也是对象的属性:

public class Deployment
{
public AppPoolSettings AppPool { get; set; }
public WebSiteSettings Site { get; set; }

public Deployment()
{
//the object constructors below init their internal properties as well...
this.AppPool = new AppPoolSettings();
this.Site = new WebSiteSettings();
}
}

我目前遇到的问题是,在 XML 中,AppPool 属性可以为 null(例如,如果您部署的是纯 HTML 包)。序列化程序正常工作,也就是说,生成的 XML 仅包含 Site 的条目,而没有 AppPool 的条目。

但是,当我反序列化该 XML 时,我的 Deployment 对象的 AppPool 属性总是被实例化和初始化...这不是 XML 的意思。

是我做错了什么还是真的只是因为默认构造函数?

看吧,我本以为反序列化器会按以下顺序执行任务:
1- 调用默认构造函数
2- XML 中是否存在 AppPool 属性?
是 --> 填写,
否 --> 设置为 NULL
3- Site 属性是否存在于 XML 中?
是 --> 填写,
否 --> 设置为 NULL

为什么不这样做?

最佳答案

我相信正确的答案是:是的,对空属性的违反直觉的处理(在序列化数据中省略它们并且在反序列化时不对它们进行任何操作)是 XmlSerializer 的一个特性。 。但是您可以覆盖该行为并强制 XmlSerializer 将空值写入具有如下属性的 XML:

public class Deployment
{
[XmlElement(IsNullable = true)]
public AppPoolSettings AppPool { get; set; }
[XmlElement(IsNullable = true)]
public WebSiteSettings Site { get; set; }

public Deployment()
{
//the object constructors below init their internal properties as well...
this.AppPool = new AppPoolSettings();
this.Site = new WebSiteSettings();
}
}

然后你会得到<AppPool xsi:nil="true" />在 XML 中和预期的反序列化。

关于c# - 反序列化和构造函数关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30938773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com