Xml连载 - System.InvalidOperationException: 是不是不能连载'this'?
Xml Serialization - System.InvalidOperationException: Is it not possible to serialize 'this'?
希望这个问题不是太明显,但是我正在迈出序列化主题的第一步,找不到对以下行为的解释:
我想序列化一个 class 来测试我是否正确设置了所有内容。为此,我采用 the code from this tutorial 并将其改编如下:
private void SerializePresets(string path)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyClass));
using (TextWriter writer = new StreamWriter(path))
{
xmlSerializer.Serialize(writer, this);
}
}
此方法位于 MyClass
中,也可以从那里调用。这给了我以下异常:
An exception of type 'System.InvalidOperationException' occurred in
System.Xml.dll but was not handled in user code
Additional information: There was an error reflecting type
'MyClass'.
由于 MyClass
首先将其他 class 对象作为属性,我想我也必须制作这些序列化器,但是异常仍然存在。
所以,我的猜测是,序列化 this
是不可能的,但是我找不到对这个猜测的证实。
编辑:属性 根据内部异常导致问题:
[XmlArray("VolumePresetList"), XmlArrayItem(typeof(LinearAxisColorPresetsModel), ElementName = "VolumePresetList")]
public ObservableCollection<LinearAxisColorPresetsModel> VolumePresetList { get; set; }
你可以用这个。它必须是像不序列化的字典这样的属性之一。请参阅下面的示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication103
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
MyClass myClass = new MyClass();
myClass.Serialize(FILENAME);
}
}
public class MyClass
{
public string test { get; set; }
public void Serialize(string filename)
{
SerializePresets(filename);
}
private void SerializePresets(string path)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyClass));
using (TextWriter writer = new StreamWriter(path))
{
xmlSerializer.Serialize(writer, this);
}
}
}
}
在内部异常的帮助下(再次感谢提示)我可以找到序列化失败的原因。
class LinearAxisColorPresetsModel
没有无参数的构造函数,这导致了这个问题。
只需添加
/// <summary>
/// Default Constructor
/// </summary>
private LinearAxisColorPresetsModel()
{
}
这个 class 解决了我的问题。剩下的就是找出原因,为什么我们必须有一个无参数的构造函数。
编辑:Found the reasoning behind this behaviour in this post.
希望这个问题不是太明显,但是我正在迈出序列化主题的第一步,找不到对以下行为的解释:
我想序列化一个 class 来测试我是否正确设置了所有内容。为此,我采用 the code from this tutorial 并将其改编如下:
private void SerializePresets(string path)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyClass));
using (TextWriter writer = new StreamWriter(path))
{
xmlSerializer.Serialize(writer, this);
}
}
此方法位于 MyClass
中,也可以从那里调用。这给了我以下异常:
An exception of type 'System.InvalidOperationException' occurred in System.Xml.dll but was not handled in user code
Additional information: There was an error reflecting type 'MyClass'.
由于 MyClass
首先将其他 class 对象作为属性,我想我也必须制作这些序列化器,但是异常仍然存在。
所以,我的猜测是,序列化 this
是不可能的,但是我找不到对这个猜测的证实。
编辑:属性 根据内部异常导致问题:
[XmlArray("VolumePresetList"), XmlArrayItem(typeof(LinearAxisColorPresetsModel), ElementName = "VolumePresetList")]
public ObservableCollection<LinearAxisColorPresetsModel> VolumePresetList { get; set; }
你可以用这个。它必须是像不序列化的字典这样的属性之一。请参阅下面的示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication103
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
MyClass myClass = new MyClass();
myClass.Serialize(FILENAME);
}
}
public class MyClass
{
public string test { get; set; }
public void Serialize(string filename)
{
SerializePresets(filename);
}
private void SerializePresets(string path)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyClass));
using (TextWriter writer = new StreamWriter(path))
{
xmlSerializer.Serialize(writer, this);
}
}
}
}
在内部异常的帮助下(再次感谢提示)我可以找到序列化失败的原因。
class LinearAxisColorPresetsModel
没有无参数的构造函数,这导致了这个问题。
只需添加
/// <summary>
/// Default Constructor
/// </summary>
private LinearAxisColorPresetsModel()
{
}
这个 class 解决了我的问题。剩下的就是找出原因,为什么我们必须有一个无参数的构造函数。
编辑:Found the reasoning behind this behaviour in this post.