Как я могу игнорировать свойства в соответствии с их значением с XmlSerializer - PullRequest
7 голосов
/ 18 декабря 2011

Я бы хотел, чтобы XML, созданный XmlSerializer, исключал свойства, если они имеют значение по умолчанию.Возможно ли это с помощью XmlSerializer или мне придется изучить IXmlSerializable?

Например, у меня может быть следующий класс:

public class PositionedObject
{
   public float X
   { get; set; }

   public float Y
   { get; set;}
}

Я хотел бы сообщить XmlSerializerкогда он сериализует экземпляр PositionedObject, чтобы не включать X, если значение равно 0 (и то же самое с Y, если оно равно 0).

Ответы [ 4 ]

11 голосов
/ 18 декабря 2011

Просто объявите метод с именем ShouldSerializeX, который возвращает true, если значение не равно 0:

public bool ShouldSerializeX()
{
    return X != 0;
}

Сериализатор вызовет этот метод, чтобы решить, следует ли сериализовать свойство.

9 голосов
/ 18 декабря 2011

Еще один поддерживаемый шаблон XmlSerializer;

[DefaultValue({whatever})]
public SomeType SomeProperty {get;set;}

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

1 голос
/ 18 декабря 2011

Ваш класс может реализовать IXmlSerializable, а в методе WriteXml выбрать не сериализовать атрибуты, которые имеют то, что вы считаете по умолчанию.

public class PositionedObject : IXmlSerializable
{

  public void WriteXml(System.Xml.XmlWriter writer)
  {
        if (  Position != DefaultPosition )
          writer.WriteAttributeString("Position", Position);
  }
}

На вашей позиции находится пара с плавающей точкой, и вы можете иметьиспользовать некоторую терпимость

0 голосов
/ 18 декабря 2011

Путь Томаса, вероятно, самый простой путь к тому, что вы хотите. Однако вы можете принять во внимание, что у технически значимых типов всегда есть значение, и вам, вероятно, следует его сериализовать. Обратите внимание, что XmlSerializer пропустит добавление элемента X, если вы объявите его как string или другой ссылочный тип.
Конечно, объявить координату X как строку было бы глупо, но вы можете объявить ее как nullable float?, которая будет сериализована как <X xsi:nil="true" />, что может быть ближе к тому, что вы на самом деле хотите ... если только вы просто хочу, чтобы ваш XML выглядел красиво, а потом получил предложение Томаса.

...