Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将事件序列化为JSON_C#_Button_Events_Serialization_Action - Fatal编程技术网

C# 将事件序列化为JSON

C# 将事件序列化为JSON,c#,button,events,serialization,action,C#,Button,Events,Serialization,Action,我正在使用Json开发一个序列化系统,但是我需要从按钮(onClick、onHover等)保存事件。有没有一种方法可以有效地做到这一点?(注意:事件都是动作)坦率地说,尝试序列化事件是个糟糕的主意 JSON通常用于序列化数据;事件不是数据-它们是实现细节。大多数JSON序列化程序(或者更广泛地说,大多数序列化程序)对委托/事件不感兴趣,因为委托/事件与数据无关,所以:这里很有可能需要手动执行任何操作。具体来说,这里的问题是事件(或者更确切地说,底层多播委托)实际上是零对、一对或多对“实例”(可选

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

坦率地说,尝试序列化事件是个糟糕的主意

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

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

然而,该实例是一个
对象
——大多数序列化程序都不喜欢它;在这种情况下,它将结合对象(引用)跟踪,可能是不在负载内的对象,也可能是不确定类型的对象(因此:可能需要存储类型元数据)

此外,反序列化允许您指向任意类型和方法的对象模型是一个巨大的安全漏洞,并且是序列化程序中众所周知的RCE弱点(不明智地,IMO)允许这种事情(例如
BinaryFormatter
;对于本主题的较长讨论,)



至于如何取而代之:当一个实现不适合给定的序列化程序时,最实用的选择是停止与序列化程序对抗,并使用它而不是对抗它。例如,您可以创建一个看起来有点像您的域模型的模型,但不需要事件/委托,它可能只是拥有表示需要应用的事件的
string[]
/
列表,并且您的代码将担心如何在它们之间映射(将方法映射到字符串,并确定目标实例应该是什么,等等)。这避免了上述所有痛点,还意味着您的数据现在与平台无关,负载和实现细节(表单布局)彼此独立。

答案是肯定的。但是,您需要阅读并添加更多信息question@MichaelRandall我想答案是“不”,但是…我同意在这个问题上有很大的差距。我想“映射为列表”将是我在这个用例中的唯一选择。谢谢你的帮助!