chi*_*oro 5 c# lambda serialization closures
今天,当 IIS 尝试将会话存储在 ASP.NET 状态服务中时SerializationException
,我遇到了一个引用某个匿名内部类的+<>c__DisplayClass10
声明它不可序列化的问题:
在程序集“Xyz, Version=1.2.5429.24450, Culture=neutral, PublicKeyToken=null”中键入“Xyz.GeneralUnderstandingTests+ASerializableType+<>c__DisplayClass10”未标记为可序列化。
我在我的代码中寻找 lambdas 并找到了很多,但它们中的大多数都不是新的,并且在序列化方面从来没有任何问题。但是后来我注意到我已经构建了一个新的 lambda 表达式,它“发生”来构建一个闭包。
在 Stackoverflow 中搜索closure serialization
我发现一些问答显示闭包不能在其他语言(如 PHP *) 中序列化,但我没有设法为 C# 找到这样的语句。然而,我已经能够构建一个非常简单的例子,它似乎证实了闭包是不可序列化的,而“正常”函数是
[TestFixture]
public class GeneralUnderstandingTests
{
[Serializable]
private class ASerializableType
{
private readonly Func<int> thisIsAClosure;
private readonly Func<int> thisIsNotAClosure;
public ASerializableType()
{
const int SomeConst = 12345;
thisIsNotAClosure = () => SomeConst; // succeeds to serialize
var someVariable = 12345;
thisIsAClosure = () => someVariable; // fails to serialize
}
}
[Test]
public void ASerializableType_CanBeSerialized()
{
var sessionStateItemCollection = new
System.Web.SessionState.SessionStateItemCollection();
sessionStateItemCollection["sut"] = new ASerializableType();
sessionStateItemCollection.Serialize(new BinaryWriter(new MemoryStream()));
}
}
Run Code Online (Sandbox Code Playgroud)
此测试失败,但在thisIsAClosure = ...
注释掉该行后立即变为绿色。thisIsNotAClosure = ...
然而,该行不会引起任何问题,因为SomeConst
它不是变量而是常量,也就是说,它不会构建闭包而是由编译器内联。
你能确认我得出的结论是正确的吗?
=> 有没有办法绕过这个问题?
=> 难道这取决于所用编译器的内部结构?因为是编译器将 lambda/闭包表达式转换为匿名内部类。
*) 链接:
归档时间: |
|
查看次数: |
640 次 |
最近记录: |