gpt4 book ai didi

c# - 如果没有子属性最终被序列化,避免向 xml 添加元素?

转载 作者:行者123 更新时间:2023-11-30 12:46:31 25 4
gpt4 key购买 nike

我有一组要序列化为 XML 的对象。这些对象在层次结构中绑定(bind)在一起,一个对象在属性中有许多子对象,这些子对象又具有子对象等。

如果包含对象的属性最终被序列化为 <tag />因为那里的对象中没有要序列化的属性(因为它们包含默认值),所以我希望该标记也消失,但我似乎无法确定这是否可能,更不用说如何做吧。

我会发布 LINQPad下面的程序,这是它转储的内容:

<?xml version="1.0" encoding="utf-16"?>
<root>
<child />
</root>

希望它转储的内容:

<?xml version="1.0" encoding="utf-16"?>
<root />

换句话说,自child标签最终为空,我希望将其删除。

这可能吗?如果是,怎么办?

请注意,我完全知道添加名称为 XYZSpecified 的属性 bool 类型,让它返回 true如果XYZ属性将被序列化,但由于这些对象本身将具有许多属性,并且包含许多也需要检查的子对象,我基本上是在问我是否可以让序列化器为我自己解决这个问题,通过从 XML 中删除这些标签,因为它们是空的。

我可以更改 XmlElementAttribute 吗?以某种方式实现这一目标的属性?或者我真的必须走添加 XYZSpecified 的路线吗?具有所有必要逻辑的属性来检查对象是否包含任何会导致它被序列化的东西?

这是 LINQPad程序:

void Main()
{
var root = new Root();
root.Child = new Child();

var serializer = new XmlSerializer(typeof(Root));
var ns = new XmlSerializerNamespaces();
ns.Add(string.Empty, string.Empty);
using (var writer = new StringWriter())
{
serializer.Serialize(writer, root, ns);
writer.ToString().Dump();
}
}

[XmlType("root")]
public class Root
{
// [XmlIgnore]
// public bool ChildSpecified { get { return Child != null && Child.HasValues; } }

[XmlElement("child")]
public Child Child { get; set; }
}

public class Child
{
// [XmlIgnore]
// public bool HasValues { get { return !string.IsNullOrWhiteSpace(Name); } }

[XmlElement("name")]
[DefaultValue(null)]
public string Name { get; set; }
}

可以将注释掉的代码加回程序中,然后就完成了我想要的,但是看到Child对象在实际项目中会有很多属性,而且其中一些属性会包含自己有属性的对象,这看起来像是维护的噩梦和错误的秘诀。如果可以说服 XML 序列化器自己解决这个问题,那就更好了。

最佳答案

看起来 Marc Gravell 已经回答了。只需使用 ShouldSerialize* 使序列化成为条件即可

[XmlType("root")]
public class Root
{
// [XmlIgnore]
// public bool ChildSpecified { get { return Child != null && Child.HasValues; } }
Child c;
[XmlElement("child")]
public Child Child { get { return c; } set { c = value; } }

public bool ShouldSerializeChild()
{
return c.Name != null;
}

}

关于c# - 如果没有子属性最终被序列化,避免向 xml 添加元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19893481/

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