Во-первых, атрибут [Serializable] не имеет ничего общего с XmlSerializer. Это красная сельдь. [Serializable] имеет значение для System.Runtime.Serialization, в то время как XmlSerializer живет в System.Xml.Serialization. Если вы украшаете свой класс с помощью [Serializable], а ваши члены - с помощью [XmlIgnore], то вы, вероятно, путаете себя или других читателей своего кода.
XmlSerialization в .NET очень гибок. В зависимости от того, как выполняется сериализация, прямо вами или косвенно, скажем, во время выполнения веб-сервисов - у вас есть разные способы управления вещами.
Один из вариантов - использовать propertyName Указанный шаблон для включения или выключения свойства в XML-сериализации. Предположим, у вас есть этот код:
public class TypeA
{
public DateTime LastModified;
[XmlIgnore]
public bool LastModifiedSpecified;
}
Тогда, если LastModifiedSpecified имеет значение false в экземпляре, поле LastModified не будет сериализовано для этого экземпляра. В конструкторе для вашего типа вы можете установить LastModifiedSpecified, чтобы всегда быть true в базовом типе и всегда false в производном типе. Фактическое логическое значение - LastModifiedSpecified - никогда не сериализуется, поскольку оно помечено как XmlIgnore.
Этот маленький трюк задокументирован здесь .
Другой вариант - использовать XmlAttributeOverrides, который представляет собой способ динамического предоставления набора атрибутов сериализации XML (таких как XmlElementAttribute, XmlIgnoreAttribute, XmlRootAttribute и т. Д.) - динамическое предоставление этих атрибутов сериализатору во время выполнения. XmlSerializer вместо проверки самого типа на предмет этих атрибутов будет просто проходить список атрибутов переопределения, предоставленных его конструктору.
var overrides = new XmlAttributeOverrides();
// ....fill the overrides here....
// create a new instance of the serializer specifying overrides
var s1 = new XmlSerializer(typeof(Foo), overrides);
// serialize as normal, here.
Это проиллюстрировано более подробно здесь .
В вашем случае вы предоставили бы XmlIgnoreAttribute в качестве переопределения, но только при сериализации производного типа. (или что-то еще). Это работает только тогда, когда вы непосредственно создаете экземпляр XmlSerializer - оно не будет работать, когда сериализация выполняется неявно во время выполнения, как с веб-сервисами.
Ура!