为什么Lazy <t>在序列化期间强制初始化?</t>

时间:2013-07-29 09:57:46

标签: c# .net lazy-evaluation

当我检查Lazy <T>类的实现时,我看到了这个块:

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

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

3 个答案:

答案 0 :(得分:3)

如果它没有并且你提供了lambda用于初始化,你认为它在重新序列化时会重新获得什么值? lambdas不可序列化。

答案 1 :(得分:1)

Lazy<T>的重点是延迟评估,直到需要它为止。这可以通过在实际需要之前不计算事物来节省处理能力。当您序列化某些内容时,通常需要序列化其值,因此Lazy<T>必须计算出 的值,以便您可以将其序列化。

答案 2 :(得分:0)

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