Не удается сохранить XDocument в классе настроек приложения
Я пытаюсь использовать IXmlSerializable
ReadXml
а также WriteXml
методы с XDocument
объект (используя Foo.WriteTo( ... )
а также XDocument.Load( ... )
методы.
Я хочу хранить класс, который реализует IXmlSerializable
интерфейс в переменную, хранящуюся в классе настроек приложения по умолчанию.
Попытка сделать это приводит к довольно неприятному провалу:
Это класс настроек:
Это класс, упаковывающий
[Serializable]
class XmlModel : IXmlSerializable {
public XDocument _foo = new XDocument(
new XElement( "Foo",
new XElement( "Bar", "Baz" ) ) );
public XmlModel( XDocument Foo ) {
_foo = Foo;
}
public XmlSchema GetSchema( ) {
return null;
}
public void ReadXml( XmlReader reader ) {
this._foo = XDocument.Load( reader );
}
public void WriteXml( XmlWriter writer ) {
_foo.WriteTo( writer );
}
}
Ааа, а это класс Program (я использую простое консольное приложение для воспроизведения проблемы)
class Program {
static void Main( string[ ] args ) {
if ( Settings.Default.DoUpgrade ) {
Settings.Default.Upgrade( );
Settings.Default.DoUpgrade = false;
Settings.Default.Save( );
}
Console.WriteLine( Settings.Default.Foo._foo );
Console.ReadLine( );
}
}
Это исключение появляется, потому что у меня включены все исключения, но даже если они выключены, ApplicationSettings
файл не принимает данные.
Почему это происходит?
1 ответ
Я нашел ответ, и Лей Ян был прав (по крайней мере, в том смысле, что я не могу использовать XDocuments с настройками приложения).
Согласно документам...
/// <summary>
/// Output this <see cref="XElement"/> to an <see cref="XmlWriter"/>.
/// </summary>
/// <param name="writer">
/// The <see cref="XmlWriter"/> to output the XML to.
/// </param>
public void Save(XmlWriter writer) {
if (writer == null) throw new ArgumentNullException("writer");
writer.WriteStartDocument();
WriteTo(writer);
writer.WriteEndDocument();
}
XDocument.Save( )
звонки writer.WriteStartDocument( )
который, по-видимому, называется далее в ApplicationSettings.Save( )
метод, а так как XDocument.Save( ... )
не может быть отменено, я (и, соответственно, все остальные, кто пытался это сделать) должен будет найти другой путь.
РЕДАКТИРОВАТЬ
Используя XElement
вместо XDocument
позволяет сохранить его в ApplicationSettings
учебный класс:
[Serializable]
class XmlModel : IXmlSerializable {
public XElement _foo = new XElement(
"Foo", new XElement( "Bar", "Baz" ) );
public XmlModel( XElement Foo ) {
_foo = Foo;
}
public XmlSchema GetSchema( ) {
return null;
}
public void ReadXml( XmlReader reader ) {
this._foo = XElement.Load( reader );
}
public void WriteXml( XmlWriter writer ) {
_foo.WriteTo( writer );
}
}