相关疑难解决方法(0)

闭包会破坏序列化吗

今天,当 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] …
Run Code Online (Sandbox Code Playgroud)

c# lambda serialization closures

5
推荐指数
0
解决办法
640
查看次数

标签 统计

c# ×1

closures ×1

lambda ×1

serialization ×1