Сериализировать строковое свойство как атрибут, даже если строка пуста - PullRequest
13 голосов
/ 29 апреля 2011
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>

Как заставитьСериализатор, чтобы создать пустой атрибут вместо того, чтобы его пропустить?

РЕДАКТИРОВАТЬ:

Оказывается, я идиот и создал пример, который содержит ошибку, потому что я хотел упростить код для примера.

Если значение цвета равно "" (или string.empty), оно фактически сериализуется как пустой атрибут.Тем не менее, у меня действительно было нулевое значение, а не пустая строка - поэтому оно было опущено.

Итак, поведение, которое я хотел, на самом деле уже было поведением созданного мною примера.ребята!

Ответы [ 3 ]

5 голосов
/ 29 апреля 2011

Попробуйте использовать 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 голос
/ 29 апреля 2011

Есть два способа сделать это.

Вы можете использовать [XmlElement(IsNullable=true)], что приведет к распознаванию нулевого значения.

Вы также можете использовать String.Empty вместо "".Это распознается как пустая строка, а не как ноль.

1 голос
/ 29 апреля 2011

Вы можете попробовать установить для свойства Specified значение true. Кроме того, я считаю, что вы можете использовать свойство ## Specified для управления сериализацией, например:

[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; } }
...