XmlIgnoreAttribute, только используемый во время сериализации, не во время десериализации?

Я исправляюсь в понимании XmlIgnoreAttribute.NET, который заявляет:

Дает Сериализировать методу команду XmlSerializer не сериализировать общедоступное поле или общедоступное значение свойства чтения/записи.

это:

  • Свойство будет десериализовано, если существующий в XML-файле?
  • Свойство не будет сериализировано к новому XML-файлу?

Причина, которую я спрашиваю, состоит в том, что я заменил свойство в файле с новым с большим количеством опций. Старое свойство было простым булево свойством, и новый является перечислением. Я изменил старое свойство так, чтобы оно преобразовало значение нового свойства в булево значение, согласно тому, что означало старое свойство, прежде чем я добавил новый, оба получают и устанавливают, был реализован.

Это позволило мне тихо обновлять новые файлы путем чтения старого свойства, которые устанавливают новое свойство, и после сериализации, новое свойство было добавлено.

Однако я хотел бы удалить старое свойство из новых XML-файлов, таким образом, я задавался вопросом, что произошло бы, если бы я отметил его с [XmlIgnore], старый XML-файл все еще десериализовал бы правильно и считал бы то свойство из файла, или это будет проигнорировано полностью?

В противном случае следующее изменение сделало бы то, что я хочу?

[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
    get { return false; }
    set {
        if (value)
            ListHandling = ListHandling.All;
    }
}

Это возвратило бы false для всех новых объектов, которые будут проигнорированы, так как я указал значение по умолчанию, и если бы существующий в старом файле, и установил на истинный, который изменил бы свойство ListHandling, которое является новым, которое важно.

Править: После тестирования я проверил, что оба подхода, кажется, делают то, что я хочу. Я оставлю вопрос, хотя, поскольку я все еще хотел бы знать, является ли первое поведение, отмеченное выше, просто деталью реализации, или если документация может быть понята тот путь.

6
задан Lasse V. Karlsen 28 February 2010 в 08:37
поделиться

1 ответ

Если вы пометите свойство тегом XmlIgnore , оно игнорируется . Это не учитывается, когда XmlSerializer строит свою сборку сериализации. Следовательно, свойства XmlIgnore-d не заполняются во время десериализации и будут оставлены со своим значением по умолчанию.

Пример программы (для компилятора сниппета):

public static void RunSnippet()
{
  XmlSerializer ser = new XmlSerializer(typeof(Fie));
  Fie f = (Fie)(ser.Deserialize(new StringReader("<Fie><Bob>Hello</Bob></Fie>")));
  WL(f.Bob == null ? "null" : "something");
}

public class Fie
{
  [XmlIgnore]
  public string Bob { get; set; }
}

Результатом этой программы будет null (и если вы удалите XmlIgnore из Fie.Bob, вы получите что-то ).

Отредактируйте в ответ на ваше изменение: Это не просто деталь реализации; это действительно задокументированное поведение атрибута. Из раздела примечаний документации (первый абзац): «Если вы примените XmlIgnoreAttribute к любому члену класса, XmlSerializer игнорирует этот член при сериализации или десериализации экземпляра класса класс." (курсив добавлен)

3
ответ дан 17 December 2019 в 18:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: