C#将事件参数序列化为Xml
我正在尝试序列化包含EventArgs对象的对象。如果在序列化时忽略EventArgs对象,一切正常,但如果不在其上方放置C#将事件参数序列化为Xml,c#,serialization,xml-serialization,eventargs,C#,Serialization,Xml Serialization,Eventargs,我正在尝试序列化包含EventArgs对象的对象。如果在序列化时忽略EventArgs对象,一切正常,但如果不在其上方放置[XmlIgnore],应用程序将崩溃并显示错误消息 System.InvalidOperationException was unhandled Message=There was an error generating the XML document. Source=System.Xml StackTrace: at System.Xml.Se
[XmlIgnore]
,应用程序将崩溃并显示错误消息
System.InvalidOperationException was unhandled
Message=There was an error generating the XML document.
Source=System.Xml
StackTrace:
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces)
at PullListTesting.SerializeXmlString.ToXml(Object Obj, Type ObjType) in D:\Workspace\MouseKeyboardLibrary\PullListTesting\SerializeXmlString.cs:line 65
at PullListTesting.frmPickCapture.btnExport_Click(Object sender, EventArgs e) in D:\Workspace\MouseKeyboardLibrary\PullListTesting\frmPickCapture.cs:line 632
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
...
这是我正在序列化的类,以及序列化的方式:
// <summary>
/// Series of events that can be recorded any played back
/// </summary>
[Serializable]
public class MacroEvent
{
[XmlAttribute("event-type")]
public MacroEventType MacroEventType = MacroEventType.NullEvent;
public EventArgs EventArgs = null;
public int TimeSinceLastEvent = 0;
public String Value = null;
public MacroEvent(){}
public MacroEvent(MacroEventType macroEventType)
{
MacroEventType = macroEventType;
TimeSinceLastEvent = 1;
}
public MacroEvent(MacroEventType macroEventType, EventArgs eventArgs, int timeSinceLastEvent)
{
MacroEventType = macroEventType;
EventArgs = eventArgs;
TimeSinceLastEvent = timeSinceLastEvent;
}
}
public static string ToXml(object Obj, System.Type ObjType)
{
XmlSerializer ser;
ser = new XmlSerializer(ObjType, SerializeXmlString.TargetNamespace);
MemoryStream memStream;
memStream = new MemoryStream();
XmlTextWriter xmlWriter;
xmlWriter = new XmlTextWriter(memStream, Encoding.UTF8);
xmlWriter.Namespaces = true;
// VVVVVVV This is where the exception occurs <-------
ser.Serialize(xmlWriter, Obj, SerializeXmlString.GetNamespaces());
// ^^^^^^^ This is where the exception occurs <------
xmlWriter.Close();
memStream.Close();
string xml;
xml = Encoding.UTF8.GetString(memStream.GetBuffer());
xml = xml.Substring(xml.IndexOf(Convert.ToChar(60)));
xml = xml.Substring(0, (xml.LastIndexOf(Convert.ToChar(62)) + 1));
return xml;
}
//
///可以录制或回放的一系列事件
///
[可序列化]
公共类宏观事件
{
[XmlAttribute(“事件类型”)]
public MacroEventType MacroEventType=MacroEventType.NullEvent;
public EventArgs EventArgs=null;
public int TimeSinceLastEvent=0;
公共字符串值=null;
公共宏事件(){}
公共宏事件(MacroEventType MacroEventType)
{
宏事件类型=宏事件类型;
TimesInclastEvent=1;
}
公共宏事件(MacroEventType MacroEventType、EventArgs EventArgs、int timeSinceLastEvent)
{
宏事件类型=宏事件类型;
EventArgs=EventArgs;
TimesInclastEvent=TimesInclastEvent;
}
}
公共静态字符串ToXml(对象Obj,系统类型ObjType)
{
XmlSerializer;
ser=新的XmlSerializer(ObjType,SerializeXmlString.TargetNamespace);
MemoryStream memStream;
memStream=新的MemoryStream();
XmlTextWriter;
xmlWriter=新的XmlTextWriter(memStream,Encoding.UTF8);
Namespaces=true;
//这就是异常发生的地方我怀疑你的问题在别处,当我尝试你的代码时,我得到了一个非常好的XML字符串,这没有使用XmlIgnore。尝试构造一个最小的测试用例(这就是我使用你的代码所做的)在控制台应用程序中,查看发生了什么。以下是我所做的更改:我必须创建我自己的MacroEventType枚举,我的枚举仅包含NullEvent。我用它更新了我的MacroEvent。我从序列化中删除了名称空间,因为我没有访问SerializeXmlString类的权限。我同意,代码运行良好。您可以将调用添加到ToXml?也许你不是真正序列化EventArgs,而是一个子类。当EventArgs不为null时会发生错误。例如,如果你获取了一个键盘事件并捕获了EventArgs,它会阻塞,但是如果获取了一个没有EventArgs的NullEvent,它会处理得很好。你并不孤单:当我尝试时,我怀疑你的问题在别处你的代码我得到了一个非常好的XML字符串,这不需要使用XmlIgnore在控制台应用程序中,查看发生了什么。以下是我所做的更改:我必须创建我自己的MacroEventType枚举,我的枚举仅包含NullEvent。我用它更新了我的MacroEvent。我从序列化中删除了名称空间,因为我没有访问SerializeXmlString类的权限。我同意,代码运行良好。您可以将调用添加到ToXml?可能您不是真正序列化EventArgs,而是一个子类。当EventArgs不为null时会发生错误。例如,如果您获取键盘事件并捕获EventArgs,它将阻塞,但如果获取不包含EventArgs的NullEvent,它将处理得很好。您并不孤单: