【问题标题】:EventHandlers within an XML file and deserialization issueXML 文件中的事件处理程序和反序列化问题
【发布时间】:2013-06-17 23:02:32
【问题描述】:

我不确定是否可以这样做,所以在我开始之前我会说。

我有一个 XML 文件,其中包含常用内容(字符串、布尔值等),但我也希望它具有特定点击事件的 EventHandler 作为节点之一。所有的点击事件都是普通的object,EventArgs e品种。

我的控股班级是这样的

namespace testxmlui
{
[Serializable]
[XmlRoot("xmlformat")]
public class XmlFormatData
{
    private List<xmlformdata> xmlform;

    public XmlFormatData()
    {
        xmlform = new List<xmlformdata>();
    }

    [XmlElement("Element")]
    public xmlformdata[] Forms
    {
        get { return xmlform.ToArray(); }
        set { xmlform = new List<xmlformdata>(value); }
    }
}

[Serializable]
public class xmlformdata
{
    public xmlformdata()
    {
    }

    public string buttonName
    { get; set; }

    public int buttonAction
    { get; set; }

    public int buttonEvent
    { get; set; }

    public bool HasEventAttached
    { get; set; }

    public EventHandler EventHandle
    { get; set; }
}
}

然后使用反序列化

private void GenerateUI()
    {
        XmlFormatData f;
        f = null;
        try
        {
            XmlSerializer s = new XmlSerializer(typeof(XmlFormatData));
            TextReader r = new StreamReader(pathToUse);
            f = (XmlFormatData)s.Deserialize(r);
            r.Close();
        }
        catch (System.IO.FileNotFoundException e)
        {
            Console.WriteLine("Error : {0}", e.Message);
        }
        catch (System.InvalidOperationException s)
        {
            Console.WriteLine("Invalid Operation Error : {0}, {1}", s.Message, s.StackTrace);
        }
// there is more, but it's all UI code, so not really a problem
}

我需要做一些特别的事情来包含 EventHandler 吗?谁能指出为什么我会收到反序列化错误?

反序列化倒退读取

无效操作错误:在 System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (System.Xml.Serialization.TypeData typeData, System.Xml.Serialization.XmlRootAttribute root, System) 出现反映类型“testxmlui.XmlFormatData”的错误.String defaultNamespace) [0x00000] in :0 在 System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(System.Type 类型,System.Xml.Serialization.XmlRootAttribute 根,System.String defaultNamespace)[0x00000] 中:0 在 System.Xml.Serialization.XmlSerializer..ctor (System.Type 类型,System.Xml.Serialization.XmlAttributeOverrides 覆盖,System.Type[] extraTypes,System.Xml.Serialization.XmlRootAttribute 根,System.String defaultNamespace)[0x00000]在 :0 在 System.Xml.Serialization.XmlSerializer..ctor(System.Type 类型)[0x00000] 中:0 在 /Volumes/Developer/Developer/ftrack2/testxmlui/testxmlui/MainActivity.cs:62 中的 testxmlui.MainActivity.GenerateUI () [0x00004]

谢谢

【问题讨论】:

  • 你试过在没有 EventHandler 属性的情况下反序列化它吗?这是我唯一能发现的。我有一个类似的东西,但我在 xml 中有方法名称,我使用反射调用它们,已知它们是针对一个名为 UserDelegates 的实体。希望这对你有帮助
  • 是的,在没有 EventHandler 属性的情况下也尝试过,给出了同样的错误。
  • 顺便说一句,XmlSerializer 不需要 [Serializable]

标签: c# xml


【解决方案1】:

XmlSerializer 是一个数据序列化器——它不会也不能序列化委托/事件,因为委托基本上是关于实现的——而不是数据。此外,序列化事件意味着您需要将序列化程序级联成更多类型,这些类型超出预期模型。所以不,这对于那个序列化程序来说是不可行的。无论如何,IMO 序列化事件通常会暗示代码气味 - 再说一遍,它们不是数据。

关于异常:查看 InnerException - 它实际上提供了非常详细的消息,但您需要深入挖掘一个级别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    相关资源
    最近更新 更多