У меня есть свойство в базовом классе, помеченном XmlIgnore
-attribute. Когда я получаю этот класс и НЕ переопределяю (в отличие от Xml-attributes in interfaces and abstract classes) это свойство, этот атрибут сохраняется, так что производный класс имеет свойство также с XmlIgnore
-attribute или мне нужно переопределить свойство, чтобы сбросить атрибут?XMLIgnore-attribute для производного класса
1
A
ответ
1
Если ваш производный класс не переопределяет свойство с помощью набора атрибутов XmlIgnore, это свойство будет должным образом игнорироваться при сериализации.
Если ваш производный класс делает, переопределите это свойство и забудьте установить атрибут XmlIgnore, это свойство будет последовательно сериализовано.
Пример кода, чтобы показать поведение:
using System;
using System.Linq;
using System.Reflection;
using System.Xml.Serialization;
[Serializable]
public abstract class myBaseClass
{
[XmlIgnore]
public virtual bool aBoolean { get; set; }
public int anInt { get; set; }
}
[Serializable]
public class myDerivedClass : myBaseClass
{
public string derivedString { get; set; }
}
[Serializable]
public class overrideXmlIgnore : myBaseClass
{
// no XmlIgnore
public override bool aBoolean
{
get
{
return base.aBoolean;
}
set
{
base.aBoolean = value;
}
}
}
class Program
{
static void Main(string[] args)
{
// build array of types we can serialize/deserialize
// uses Linq and Reflection namespaces
Type[] derivedTypes = (from lAssembly in AppDomain.CurrentDomain.GetAssemblies()
from lType in lAssembly.GetTypes()
where typeof(myBaseClass).IsAssignableFrom(lType)
select lType).ToArray();
// build a test object to serialize with XMLIgnore still used
myDerivedClass m = new myDerivedClass();
m.aBoolean = true; // this property is ignored by default
m.derivedString = "test";
// set a file path to serialize to
string testFilePath = "C:\\temp\\test.xml";
// serialzie the object
XmlSerializer x = new XmlSerializer(typeof(myBaseClass), derivedTypes);
System.IO.StreamWriter sw = new System.IO.StreamWriter(testFilePath);
x.Serialize(sw, m);
sw.Close();
// deserialize the object
System.IO.StreamReader sr = new System.IO.StreamReader(testFilePath);
myBaseClass deserializedObject = (myBaseClass)x.Deserialize(sr);
sr.Close();
// check the object's properties
// aBoolean is false, even though the serialized object m set it to true, because of XmlIgnore
Console.WriteLine("aBoolean = " + deserializedObject.aBoolean.ToString());
// repeat process for the derived class that overrides and does not set XmlIgnore
overrideXmlIgnore o = new overrideXmlIgnore();
o.aBoolean = true;
sw = new System.IO.StreamWriter(testFilePath);
x.Serialize(sw, o);
sw.Close();
sr = new System.IO.StreamReader(testFilePath);
deserializedObject = (myBaseClass)x.Deserialize(sr);
// check the object's properties
// aBoolean is true, as we no longer XmlIgnore
Console.WriteLine("aBoolean = " + deserializedObject.aBoolean.ToString());
}
}
Смежные вопросы
- 1. Использование XmlIgnoreAttribute для игнорирования свойства базового класса
- 2. Интерфейс для производного класса
- 3. Entity Framework и XmlIgnoreAttribute
- 4. C++ reinterpret_cast для производного класса
- 5. Список инициализаторов для производного класса
- 6. Swig typecast для производного класса?
- 7. Сериализация производного класса для XML
- 8. Специализация частного класса для производного класса
- 9. Cast для базового класса из производного класса
- 10. Литейный объект базового класса для производного класса
- 11. Как получить тип производного класса из другого производного класса
- 12. Переместить конструктор производного класса
- 13. Практическое применение производного класса
- 14. Метод вызова производного класса
- 15. вызов метода родительского класса из производного производного класса
- 16. Сериализация/десериализация производного класса
- 17. Оператор производного класса = ошибка
- 18. предотвращать уничтожение производного класса
- 19. Неожиданное поведение производного класса
- 20. C# отливка производного класса
- 21. Проверьте тип производного класса
- 22. конструктор производного класса наследования
- 23. вперед декларация производного класса
- 24. Переопределить переменную производного класса
- 25. Размер производного класса
- 26. Получение полей производного класса
- 27. размер производного класса
- 28. Шаблон производного класса
- 29. Конструктор производного класса (Java)
- 30. Указатель базового класса динамического класса C++ для указателя производного класса