Asp.net:代表(“Action”)可以序列化为控制状态吗?

时间:2009-12-22 17:22:08

标签: asp.net serialization delegates

我正在实现一个用户控件,该控件有一个将Action委托作为参数的方法。

尝试将委托存储在“控制状态”中会产生序列化错误。甚至可以将委托序列化为控制状态吗?

BP

2 个答案:

答案 0 :(得分:3)

不容易 - 它可能为潜在的问题敞开大门。

理论上可以使用反射来确定委托调用的对象的哪个方法,并为其编写自定义序列化过程。在反序列化时,您将再次需要编写逻辑以将信息转换为委托引用。

问题在于,在一般情况下,在运行时发现需要重新生成委托的对象并不总是可行的。如果委托引用lambda或匿名方法,那么事情会更复杂,因为它们可能涉及闭包。

你可能会更好:

  1. 不保留请求之间的Action委托,并让ASP.NET代码在回发时重新附加委托。这是IMHO风险最小的选择。

  2. 将委托引用存储在会话状态中,并在回发时将其重新附加到反序列化对象。此选项存在风险,原因有两个:

    a)如果最终用户从不回发,或者忘记从服务器状态清除对象,则在内存中无限期地保持对象引用。

    b)如果委托引用页面元素(控件等),则可以运行 由于代表将针对上一个请求中的对象而不是新请求进行操作,因此会产生微妙的错误。

答案 1 :(得分:2)

在这篇文章中,作者序列化了一个Action对象,以便及时执行。 您可以将自己的操作序列化扩展为字符串而不是文件。

非常有趣:

http://mikehadlow.blogspot.com/2011/04/serializing-continuations.html