.NET序列化和缓存问题

时间:2010-01-02 13:17:59

标签: .net serialization caching

假设我有一个Object A,其成员类型为Object B ..而Object B的成员类型为Object C.

对象非常小的更改但是经常读取,而对象C经常这样做。缓存对象A是有意义的,但是当它被序列化以进入缓存时,显然会将整个图形序列化。

方案: 从数据库中读取对象A并填充。访问并延迟加载Object C类型的变量。为了示例,在业务逻辑中引用了C.Status,其值为ACTIVE。我将A.Name更改为“New Name”,并提交到数据库和我的缓存。

对象C(来自代码中的其他位置)将其状态更改为SUSPEND。

  • 此时我应该使对象A的缓存失效吗? *

如果我这样做:

如果(A.B.C.Status == ACTIVE)    SendLotsOfMoney(A)

这将通过,因为整个图表是序列化的。

如果C.Status频繁更改,我不想让A的缓存无效,因为我可能经常引用A.Name,A.Status等,并且不想继续访问数据库。

我想我的选择是: 1)在对象中有一个标志,它来自缓存,并强制第一次重新加载所有依赖项(如果有)并且它们被引用(延迟加载它们)。这些可能来自缓存..但是我的缓存中仍然存在大量无意义的存储数据。

2)保持缓存无效。显然,如果我有A.B.C.D.E.F.G.Status和A.H.I.J.K.Status等,那么我将一直在重建A?

3)我重写OnDeserialization并执行(1)

中的操作

4)我重写OnSerialization并将所有引用设置为null(因此它们是延迟加载而不是存储?)

我很想听听回复。我倾向于4

问候!

2 个答案:

答案 0 :(得分:1)

当C发生变化时,您是否有办法将A.B中对C的引用更改为null?然后,不要使所有A无效,只需将C引用设置为null,并在需要时再次对其进行延迟加载。

或者,您可以单独从A和B缓存C.在A.B而不是对C的引用中,您可以保留缓存键。然后,您可以在需要时使C无效,并使用缓存键来检索和/或延迟加载它,

答案 1 :(得分:0)

我在想,当我将项目添加到缓存时,我会将数据对象标记为“BeenCached”,然后当对象需要再次加载各种属性时,它将检查第一个的缓存标志检查它的各个ReloadedFromCache标志并填充它(可能从缓存或数据库中重新填充)。

应该可以正常工作。因为对象在其他地方被序列化/反序列化,所以我不会进行序列化/反序列化路由。