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

StackOverflow https://stackoverflow.com/questions/2350453

Вопрос

Я прав в понимании .net Xmlignoreattribute, что говорит:

Инструктирует метод сериализации 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, это изменило бы свойство листлинг, которое является новым, который является важным.

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

Это было полезно?

Решение

Если вы помечаете свойство с 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 вывод something).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top