将字符串属性序列化为属性,即使字符串为空
本文关键字:属性 字符串 序列化 | 更新日期: 2023-09-27 17:53:41
public class Hat
{
[XmlTextAttribute]
public string Name { get; set; }
[XmlAttribute("Color")]
public string Color { get; set; }
}
var hat1 = new Hat {Name="Cool Hat", Color="Red"};
var hat2 = new Hat {Name="Funky Hat", Color=null};
这是我得到的(注意在Funky Hat上缺少color-attribute):
<Hats>
<Hat Color="Red">Cool Hat</Hat>
<Hat>Funky Hat</Hat>
</Hats>
这就是我想要的:
<Hats>
<Hat Color="Red">Cool Hat</Hat>
<Hat Color="">Funky Hat</Hat>
</Hats>
我怎样才能强制序列化器创建一个空属性而不是把它去掉?
<标题>编辑:原来我是一个白痴,创建了一个包含错误的示例,因为我想简化示例的代码。
如果color的值是"(或string.empty),它实际上被序列化为一个空属性。然而,我确实有一个空值,而不是一个空字符串-因此它被省略了。
所以我想要的行为实际上已经是我创建的例子的行为了。
对不起,伙计们!
标题>尝试使用List<Hat>
作为容器。使用这个:
var hats = new List<Hat>
{
new Hat { Name = "Cool Hat", Color = "Red" },
new Hat { Name = "Funky Hat", Color = string.Empty }
};
using (var stream = new FileStream("test.txt", FileMode.Truncate))
{
var serializer = new XmlSerializer(typeof(List<Hat>));
serializer.Serialize(stream, hats);
}
我得到这个:
<?xml version="1.0"?>
<ArrayOfHat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Hat Color="Red">Cool Hat</Hat>
<Hat Color="">Funky Hat</Hat>
</ArrayOfHat>
您可以尝试将Specified
属性设置为true。另外,我相信您可以使用##指定的属性来控制序列化,就像这样:
[XmlAttribute("Color")]
public string Color { get; set; }
[XmlIgnore]
public bool ColorSpecified { get { return true; } } // will always serialize
或者你可以序列化,只要它不为空:
[XmlIgnore]
public bool ColorSpecified { get { return this.Color != null; } }
有两种方法可以做到这一点。
您可以使用[XmlElement(IsNullable=true)]
,它将强制识别空值。
也可以使用String。空而不是"。这将被识别为空字符串而不是null。