XmlIgnoreAttribute, используется только во время сериализации, а не во время десериализации? - PullRequest
6 голосов
/ 28 февраля 2010

Прав ли я в понимании .NET XmlIgnoreAttribute , который говорит:

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

, что:

  • Свойство будет десериализовано, если оно присутствует в файле XML?
  • Свойство не будет сериализовано в новый файл XML?

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

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

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

Если нет, будет ли следующее изменение делать то, что я хочу?

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

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

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

1 Ответ

3 голосов
/ 28 февраля 2010

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

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

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, вывод something).

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

...