我正在尝试将IXmlSerializable
ReadXml
和WriteXml
方法与XDocument
对象一起使用(使用Foo.WriteTo( ... )
和XDocument.Load( ... )
方法。
我想将实现IXmlSerializable
接口的类存储到存储在默认Application Settings类中的变量中。
尝试这样做会导致非常令人讨厌的失败:
这是设置类:
这是包装
的类[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 );
}
}
Aaaand这是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
文件也不会获取数据。
为什么会这样?
答案 0 :(得分:0)
我找到了答案,雷阳是正确的(至少在我不能将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 );
}
}