C#将事件参数序列化为Xml

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

我正在尝试序列化包含EventArgs对象的对象。如果在序列化时忽略EventArgs对象,一切正常,但如果不在其上方放置
[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,它将处理得很好。您并不孤单: