将事件序列化为 JSON

Serializing Events into JSON

我正在使用 Json 开发序列化系统,但我需要保存来自按钮(onClick、onHover 等)的事件。有没有一种方法可以有效地做到这一点? (注意:事件都是动作)

坦率地说,尝试序列化事件是糟糕的想法

JSON通常用于序列化data;事件不是数据——它们是实现细节。大多数 JSON 序列化程序(或更广泛地说:大多数 序列化程序)对委托/事件不感兴趣,因为 与数据不相关 ,因此:很有可能您要在此处执行的任何操作都需要手动操作。具体来说,这里的问题是 event(或者更确切地说,底层多播委托)实际上是零、一对或多对“实例”(可选)和“方法”(必需) ).

这里的方法是一个MethodInfo,并没有很好的方法将MethodInfo序列化为文本(虽然至少理论上是可能,尽管与更改代码相比会非常脆弱。

然而,实例是一个object——大多数序列化器讨厌;在这种情况下,它将结合对象(参考)跟踪,可能是对象不在负载内的不确定类型(因此:可能需要存储类型元数据)。

此外,反序列化允许您指向任意类型和方法的对象模型是一个 巨大的 安全漏洞,并且是序列化程序中的 well-known RCE 弱点(不明智的,IMO)允许这种事情发生(例如 BinaryFormatter;对于这个主题的更长时间的讨论,see here)。


至于该怎么做而不是:每当一个实现不适合给定的序列化器时,最实用的选择就是停止与序列化程序作对,使用它而不是对抗它。例如,您可以创建一个看起来 有点像 领域模型的模型,但它可能只有 string[] 而不是 events/delegates / List<string> 表示你需要应用的事件,而 你的代码 会担心如何在它们之间进行映射(将方法映射到字符串,并弄清楚目标实例应该是什么是等)。这避免了 所有 上面的痛点,另外意味着您的数据现在是平台独立的,负载和实现细节(您的表单布局)与 each-other 分开。