Как я могу XML сериализовать запечатанный класс без конструктора без параметров? - PullRequest
5 голосов
/ 24 августа 2010

В настоящее время я использую XMLSerializer для сериализации списка моего собственного класса. Одним из свойств класса является экземпляр закрытого класса, у которого нет конструктора без параметров, поэтому XML Serializer отказывается сериализовать класс. Как я могу обойти это? Мне нужно, чтобы это свойство было сериализовано.

Есть ли способ указать, как этот класс должен быть сериализован?

Мы бы хотели остаться с XML; Есть ли другой XML-сериализатор, который я мог бы использовать, не было бы этой проблемы?

Опять же, я прошу прощения, если это обман, но я понятия не имел, что искать.

[ПРАВКА] Чтобы уточнить, у меня нет доступа к источнику запечатанного класса.

Ответы [ 5 ]

12 голосов
/ 24 августа 2010

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

Что я обычно делаю, это оборачиваю класс без параметров в другой класс, совместимый с XML.Класс-оболочка имеет конструктор без параметров и набор свойств для чтения и записи;у него есть FromXml метод, который вызывает конструктор реального класса.

[XmlIgnore]
public SomeClass SomeProperty { get; set; }

[XmlElement("SomeProperty")]
public XmlSomeClass XmlSomeProperty
{
    get { return XmlSomeClass.ToXml(SomeProperty); }
    set { SomeProperty = value.FromXml(); }
}
0 голосов
/ 24 августа 2010

Использование IXmlSerializable, XmlSerializer слишком ограничено.

0 голосов
/ 24 августа 2010

В зависимости от сложности xml, вам может повезти с DataContractSerializer.Это не предлагает ничего как такого же уровня управления XML, но оно полностью обходит конструктор.И работает для частных типов.

Я мог бы также спросить: действительно ли это должен быть XML?Существуют другие сериализаторы для таких вещей, как json или protobuf, которые не имеют ограничений XmlSerializer.

0 голосов
/ 24 августа 2010

Вы можете реализовать ISerializable для содержащего класса, а затем реализовать пользовательский сериализатор.

0 голосов
/ 24 августа 2010

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

...