2010-01-02 67 views
1

说我有对象A,其具有类型对象B的成员,..和对象B具有Object类型的构件C..NET序列化和高速缓存问题

对象A很少变化,但被读取很频繁,而对象C经常这样做。缓存对象A是有意义的,但是当它被序列化进入缓存时,显然会将整个图表序列化。

情景: 对象A从数据库和填充阅读。对象C的变量被访问并延迟加载。为了举例,C.Status在业务逻辑中被引用,并且具有值ACTIVE。我将A.Name更改为“New Name”,并提交给数据库和缓存。

对象C(从代码别的地方)有它的状态改为挂起。

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

如果我做的:

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

这会通过,因为整个图形序列化。

如果C.Status勤换我不想保持的高速缓存失效,因为我可能会经常提到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并设置所有引用为空(所以他们延迟加载,而不是存储在哪里?)

我m有兴趣听到答复。我倾向于4

问候!

+1

你不应该违反德米特法! – jason 2010-01-02 13:22:34

+0

这可能是真的,但我继承了另一个系统,并且存在与往返于DB的性能问题 – sjhuk 2010-01-02 13:45:44

回答

1

你有办法在A·B改变参考C到零C钮时?然后,而不是使所有A无效,只需将C引用设置为null并在您需要时再次加载它即可。

或者,你可以从A和B分别缓存C.在A·B,而不是到C的引用,你可以保持一个高速缓存键。然后,你可以在你需要无效C,并使用缓存键来检索和/或延迟加载它,

0

我在想,当我添加项目到缓存我要举报的数据对象“BeenCached”,然后当对象需要再次加载各种属性时,它会检查缓存标志,首先检查它是单独的ReloadedFromCache标志并填充它(可能从缓存或数据库重新填充)。

它应该工作正常。因为对象在其他地方被序列化/反序列化,所以我不会去掉序列化/反序列化路线。