Вопрос по .net, c# – .net XmlSerializer, игнорировать свойства базового класса

3

Допустим, у нас есть производный класс «SerializableLabel» из базового класса "System.Windows.Controls.

[XmlRoot("SerializableLabel")]
public class SerializableLabel : Label
{
    public string foo = "bar";
}

Я хотел бы сериализовать этот класс, но игнорировать ВСЕ свойства в родительском классе. В идеале XML должен выглядеть примерно так:

<SerializableLable>
    <foo>bar</foo>
</SerializableLable>

How is this best achieved?

Моя первая попытка использовала типичный подход XmlSerializer:

XmlSerializer s = new XmlSerializer(typeof(SerializableLabel));
TextWriter w = new StreamWriter("test.xml");
s.Serialize(w, lbl);
w.Close();

Но это вызывает исключение, потому что сериализатор пытается сериализовать свойство базового класса, которое является интерфейсом (ICommand Command).

Ваш Ответ

4   ответа
1

Если вы хотите игнорировать свойства во время сериализации, вы можете использовать переопределения атрибутов Xml.
Увидетьэтот вопрос для вступления, чтобы приписать переопределения.

это помогло, спасибо ccunni
0

В вашем файле text.xml вы можете переименовать корень в SerializableLabel, а не в SerializableLable (небольшая опечатка)

1

Один из возможных корней вышеуказанных проблем (включая проблему, указанную JP) состоит в том, что ваша иерархия классов пытается нарушитьПринцип замещения Лискова, Проще говоря, производный класс пытаетсяnot делать то, что уже делает базовый класс. Другими словами, вы пытаетесь создать производную метку, которая не может заменить базовую метку.

Наиболее эффективное средство здесь может включать в себя разделение двух вещей, которыеSerializableLabel Это пытается сделать, (а) функции, связанные с пользовательским интерфейсом и (б) хранение сериализуемых данных, и их в разных классах.

Спасибо за ваши ответы! Похоже, я нарушаю принцип подстановки Лискова. Возможно, это потому, что я довольно ревностно отношусь к игнорированию свойств в базовом классе. Правда в том, что я хочу игнорировать только свойства, которые препятствуют сериализации метки, например, те, чей тип является интерфейсом. ccunni
0

Вы можете написать собственный сериализатор сIXmlSerializable, но вы бы создали ситуацию, когда ваша сериализация не воссоздает класс должным образом. Пусть кто-нибудь скажет BackColor на вашей SerializableLabel, который не прошел бы через процесс сериализации должным образом.

Похожие вопросы