Понимание System.Xml.Serialization.XmlIgnoreAttribute с базовыми классами - PullRequest
1 голос
/ 03 августа 2010

У меня есть два класса, показанных ниже:

[Serializable]
[XmlInclude(typeof(SomeDerived))]
public class SomeBase
{
    public string SomeProperty { get; set; }
}

public class SomeDerived : SomeBase
{
    [XmlIgnore]
    public new string SomeProperty { get; set; }
}

Когда я сериализуюсь и экземпляр SomeDerived, я не ожидаю увидеть значение для SomeProperty.Тем не менее, я делаю.Я пробовал другие подходы, такие как SomeProperty, объявленный как virtual в SomeBase и переопределение его в SomeDerived.Тем не менее я вижу это в сериализованном экземпляре SomeDerived.

Может кто-нибудь объяснить, что происходит с XmlIgnoreAttribute?

Для полноты, мой код десериализации ниже

class Program
{
    static void Main(string[] args)
    {
        SomeDerived someDerived = new SomeDerived { SomeProperty = "foo" };

        XmlSerializer ser = new XmlSerializer(typeof(SomeBase));

        MemoryStream memStream = new MemoryStream();
        XmlTextWriter xmlWriter = new XmlTextWriter(memStream, Encoding.Default);
        ser.Serialize(memStream, someDerived);

        xmlWriter.Close();
        memStream.Close();
        string xml = Encoding.Default.GetString(memStream.GetBuffer());

        Console.WriteLine(xml);
        Console.ReadLine();
    }
}

Редактировать

Я получаю такое же поведение, если я изменяю объявление сериализатора на new XmlSerializer(typeof(SomeDerived)).

1 Ответ

2 голосов
/ 03 августа 2010

Попробуйте это. Он использует переопределение в конструкторе XmlSerializer для передачи некоторых переопределений сериализации:

SomeDerived someDerived = new SomeDerived { SomeProperty = "foo" };

// Create the XmlAttributeOverrides and XmlAttributes objects.
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attrs = new XmlAttributes();

/* Use the XmlIgnore to instruct the XmlSerializer to ignore
    the GroupName instead. */
attrs = new XmlAttributes();
attrs.XmlIgnore = true;
overrides.Add(typeof(SomeBase), "SomeProperty", attrs);

XmlSerializer ser = new XmlSerializer(typeof(SomeBase), overrides);

MemoryStream memStream = new MemoryStream();
XmlTextWriter xmlWriter = new XmlTextWriter(memStream, Encoding.Default);
ser.Serialize(memStream, someDerived);

xmlWriter.Close();
memStream.Close();
string xml = Encoding.Default.GetString(memStream.GetBuffer());
...