【问题标题】:Why Lazy<T> forces initialization during serialization?为什么 Lazy<T> 在序列化期间强制初始化?
【发布时间】:2013-07-29 09:57:46
【问题描述】:

当我检查 Lazy&lt;T&gt; 类的实现时,我看到了这个块:

[OnSerializing]
private void OnSerializing(StreamingContext context)  
{  
     T obj = this.Value;  
} 

如您所见,它在序列化期间强制初始化。有谁知道为什么默认首选这种行为?

【问题讨论】:

    标签: c# .net lazy-evaluation


    【解决方案1】:

    如果它没有并且您提供了 lambda 用于初始化,您认为它在哪里检索反序列化的值? lambda 是不可序列化的。

    【讨论】:

    • 我同意你所说的,但你对 lambdas 不可序列化是错误的。一些 lambda 表达式可以序列化,但这不是一件好事。
    【解决方案2】:

    Lazy&lt;T&gt; 的全部意义在于延迟评估直到需要它。这可以通过在您真正需要之前不计算事物来节省您的处理能力。当你序列化某些东西时,你通常想要序列化它的值,所以Lazy&lt;T&gt; 必须弄清楚那个值是什么,这样你才能序列化它。

    【讨论】:

    • 它没有回答他的问题,因为你在序列化时不需要它的值。这是因为你不能序列化 lambdas 并延迟评估。
    • 这取决于 T 是什么,但是是的,这就是 为什么 你需要这个值。你不能依赖能够序列化评估函数,所以你序列化它的结果。
    【解决方案3】:

    想知道是否有人有解决方法。我们在我们的许多对象上使用 Lazy,它工作得很好,除非我们将对象放入自定义的 ASP.NET 缓存中,因为我们对象的所有 Lazy 类型属性都被序列化到缓存中,并评估了 .Value。这意味着这些惰性委托函数的“急切”加载是昂贵的。其中大部分是昂贵的数据库/存储库层

    【讨论】:

    • a) 这不是答案。 b)也许向属性添加一个属性,这样它就不会被序列化/反序列化?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多