将字符串属性序列化为属性,即使字符串为空

时间:2011-04-29 17:08:53

标签: c# xml-serialization

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上缺少颜色属性):

<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),则它实际上被序列化为空属性。但是,我确实有一个空值,而不是一个空字符串 - 因此它被遗漏了。

所以我想要的行为实际上已经是我创建的示例的行为。

对不起,伙计们!

3 个答案:

答案 0 :(得分:5)

尝试使用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>

答案 1 :(得分:1)

您可以尝试将Specified属性设置为true。另外,我相信您可以使用## Specified属性来控制序列化,如下所示:

[XmlAttribute("Color")]
public string Color { get; set; }
[XmlIgnore]
public bool ColorSpecified { get { return true; } }    // will always serialize

或者你可以序列化,只要它不是null:

[XmlIgnore]
public bool ColorSpecified { get { return this.Color != null; } }

答案 2 :(得分:1)

有两种方法可以做到这一点。

您可以使用[XmlElement(IsNullable=true)],这将强制识别空值。

您也可以使用String.Empty而不是“”。这被识别为空字符串而不是null。