Я исправляюсь в понимании XmlIgnoreAttribute.NET, который заявляет:
Дает Сериализировать методу команду XmlSerializer не сериализировать общедоступное поле или общедоступное значение свойства чтения/записи.
это:
Причина, которую я спрашиваю, состоит в том, что я заменил свойство в файле с новым с большим количеством опций. Старое свойство было простым булево свойством, и новый является перечислением. Я изменил старое свойство так, чтобы оно преобразовало значение нового свойства в булево значение, согласно тому, что означало старое свойство, прежде чем я добавил новый, оба получают и устанавливают, был реализован.
Это позволило мне тихо обновлять новые файлы путем чтения старого свойства, которые устанавливают новое свойство, и после сериализации, новое свойство было добавлено.
Однако я хотел бы удалить старое свойство из новых XML-файлов, таким образом, я задавался вопросом, что произошло бы, если бы я отметил его с [XmlIgnore]
, старый XML-файл все еще десериализовал бы правильно и считал бы то свойство из файла, или это будет проигнорировано полностью?
В противном случае следующее изменение сделало бы то, что я хочу?
[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
get { return false; }
set {
if (value)
ListHandling = ListHandling.All;
}
}
Это возвратило бы false для всех новых объектов, которые будут проигнорированы, так как я указал значение по умолчанию, и если бы существующий в старом файле, и установил на истинный, который изменил бы свойство ListHandling, которое является новым, которое важно.
Править: После тестирования я проверил, что оба подхода, кажется, делают то, что я хочу. Я оставлю вопрос, хотя, поскольку я все еще хотел бы знать, является ли первое поведение, отмеченное выше, просто деталью реализации, или если документация может быть понята тот путь.
Если вы пометите свойство тегом 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 игнорирует этот член при сериализации или десериализации экземпляра класса класс." (курсив добавлен)