Игнорировать унаследованный класс при сериализации объекта - PullRequest
1 голос
/ 26 марта 2011

Когда я наследую от класса и сериализую новый класс, я получаю все все свойства.Как я могу предотвратить это?У меня нет контроля над классом, от которого я наследую.Поэтому я не могу добавить атрибуты к его свойствам (XmlIgnore).

Пример

class A 
{
    public string PropertyA {get;set;}
}

class B:A
{
    public string PropertyB {get;set;}
}

Когда я сериализую объект с типом B, я получаю и PropertyA, и PropertyB, и мне нужен только PropertyB

Я использую сериализацию XML

Type t = serObj.GetType();
XmlSerializer xser = new XmlSerializer(t);
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);

xser.Serialize(sw, serObj);
string xml = sw.ToString();

Ответы [ 4 ]

1 голос
/ 26 марта 2011

Если B наследуется от A, он наследует PropertyA, и вы ничего не можете с этим поделать. Если вы не хотите сериализовать PropertyA при сериализации экземпляра B, возможно, вам не стоит наследовать A в первую очередь ...

В любом случае, я не думаю, что сериализация XML может помочь вам в том, что вы пытаетесь сделать, если вы сами не реализуете IXmlSerializable ...

1 голос
/ 26 марта 2011

Это было решение, которое я придумал.

        public void WriteXml(XmlWriter writer)
        {
            foreach (PropertyInfo propertyInfo in this.GetType().GetProperties())
            {
                string name = propertyInfo.Name;

                if (propertyInfo.DeclaringType != typeof(A))
                {
                    object obj = propertyInfo.GetValue(this, null);

                    if (obj != null)
                    {
                        writer.WriteStartElement(name);
                        string value = obj.ToString();
                        writer.WriteValue(value);
                        writer.WriteEndElement();
                    }
                }
            }
        }
0 голосов
/ 20 сентября 2016

Опоздал на вечеринку, но: я просто наткнулся на твой вопрос, потому что у меня похожая проблема. Я наследую от класса, но логика моего производного класса делает некоторые свойства базового класса избыточными или устаревшими для сериализации, и поэтому я не хочу их сериализовать.

Я нашел решение, которое не такое автоматическое, как у вас, но более гибкое: переопределите свойства базового класса и отметьте их [XmlIgnore]. Реализация в переопределении может просто состоять из вызова базовой реализации; единственная цель переопределения - присоединить к нему атрибут XmlIgnore.

Это менее автоматически, потому что если свойства в базовом классе изменяются, вы должны отражать изменения в производном классе. Это, с другой стороны, более гибко, потому что вы можете выбрать , которые свойства игнорировать.

По общему признанию, это решение плохо масштабируется и лучше всего подходит для небольших проектов с тесными связями между вовлеченными классами и людьми.

0 голосов
/ 26 марта 2011

Одним из решений является использование атрибута [Nonserialized] в PropertyA. Обратите внимание, что с этим атрибутом PropertyA никогда не будет сериализован, в том числе при сериализации экземпляра класса A. Это приемлемо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...