Атрибут C # XmlIgnore и класс XamlWriter - XmlIgnore не работает - PullRequest
7 голосов
/ 01 января 2011

У меня есть класс, содержащий свойство Brush MyBrush, помеченное как [XmlIgnore]. Тем не менее он сериализуется в потоке, вызывая проблемы при попытке чтения через XamlReader.

Я провел несколько тестов, например при изменении видимости свойства (на внутреннее) оно уходит в поток. К сожалению, я не могу сделать это в моем конкретном сценарии.

  1. Кто-нибудь имел такую ​​же проблему и?
  2. Видите ли вы способ обойти это?

Примечание: C # 4.0, насколько я могу судить

Это метод из моего модульного теста, где я тестирую XamlSerialization:

            // buffer to a StringBuilder
            StringBuilder sb = new StringBuilder();
            XmlWriter writer = XmlWriter.Create(sb, settings);
            XamlDesignerSerializationManager manager = new XamlDesignerSerializationManager(writer) {XamlWriterMode = XamlWriterMode.Expression};

            XamlWriter.Save(testObject, manager);
            xml = sb.ToString();
            Assert.IsTrue(!String.IsNullOrEmpty(xml) && !String.IsNullOrEmpty(xml), "Xaml Serialization failed for " + testObject.GetType() + " no xml string available");

            xml = sb.ToString();
            MemoryStream ms = xml.StringToStream();
            object root = XamlReader.Load(ms);
            Assert.IsTrue(root != null, "After reading from MemoryStream no result for Xaml Serialization");

В одном из моих занятий я использую свойство Brush. В приведенном выше коде это модульное тестирование завершается неудачно, поскольку значением является объект Brush (не сериализуемый). Когда я удаляю Сеттер (как показано ниже), модульное тестирование проходит.

Использование XmlWriter (в основном тот же тест, что и выше) работает. В StringBuffer sb я вижу, что Property Brush сериализуется, когда сеттер есть, а не когда его удаляют (скорее всего, другая проверка игнорирует свойство из-за отсутствия сеттера). Другие свойства с [XmlIgnore] игнорируются, как предполагалось.

    [XmlIgnore]
    public Brush MyBrush
    {
        get { ..... }
        // removed because of problem with Serialization
        // set { ... }
    }

1 Ответ

14 голосов
/ 03 января 2011

Комментарий Джона верен.Есть (опять же) другие атрибуты.Я нашел эту отличную статью здесь: http://blogs.msdn.com/b/mikehillberg/archive/2006/09/16/xamlwriter.aspx

Я даже сталкивался с атрибутом [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] раньше, но неправильно истолковал его как атрибут времени разработки.

...