【发布时间】:2009-12-22 17:22:08
【问题描述】:
我正在实现一个用户控件,该控件具有一个将 Action 委托作为参数的方法。
尝试将委托存储在控制状态中会产生序列化错误。甚至可以将委托序列化为控制状态吗?
BP
【问题讨论】:
标签: asp.net serialization delegates
我正在实现一个用户控件,该控件具有一个将 Action 委托作为参数的方法。
尝试将委托存储在控制状态中会产生序列化错误。甚至可以将委托序列化为控制状态吗?
BP
【问题讨论】:
标签: asp.net serialization delegates
不容易 - 它可能会为潜在问题打开大门。
理论上可以使用反射来确定委托调用的对象的哪个方法,并为其编写自定义序列化过程。反序列化后,您将再次需要编写逻辑将信息转换为委托引用。
问题在于,在一般情况下,并非总是可以在运行时发现需要为其重新生成委托的对象。如果委托引用了 lambda 或匿名方法,这会使事情变得更加复杂,因为它们可能涉及闭包。
你可能会更好:
不保留请求之间的操作委托,并让 ASP.NET 代码在回发时重新附加委托。恕我直言,这是风险最小的选择。
将委托引用存储在会话状态中,并在回发时将其重新附加到反序列化对象。此选项存在风险,原因有两个:
a) 如果最终用户从不回发,或者您忘记从服务器状态清除对象,则无限期地在内存中保留对象引用。
b) 如果委托引用页面元素(控件等),您可以运行 因为委托将针对上一个请求中的对象进行操作,而不是新请求。
【讨论】:
在这篇文章中,作者序列化了一个 Action 对象,以便稍后执行。 您可以在自己的操作中将序列化扩展为字符串而不是文件。
非常有趣:
http://mikehadlow.blogspot.com/2011/04/serializing-continuations.html
【讨论】: