Xmlignoreattribute, используется только во время сериализации, а не во время десериализации?
-
23-09-2019 - |
Вопрос
Я прав в понимании .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 игнорирует участника при сериализации или десериализация экземпляр класса. »(Акцент добавлен)