我正在编写一个从不同客户端接收大消息的 WCF 服务。这些消息中的每一个都由一个对象图组成,其中许多内部对象可能是相同的。我的服务将这些消息中的数据存储到内存中。
我试图最小化服务的内存消耗。所以我想存储一个对象而不是从网络接收到的几个相同的对象(嵌套在对象图中)。
我正在使用 DataContractSerializer 所以首先想到的是使用Object Graph Preservation选项preserveObjectReferences
,但是这种方法有一些缺点:
- 与其他技术没有互操作性(如果这是唯一的问题,我可以忍受)。
- 序列化和反序列化过程运行较慢。
- 当不同消息(可能来自不同客户端)之间的对象相同时,没有多大帮助。仅适用于同一消息中同一对象图上的对象。
因此,接下来想到的是使用某种缓存。当我收到一条消息时,我可以遍历对象图,使用缓存为所有相同的对象找到一个实例,并用这个实例更新我的存储。当存储处理了对该对象的所有引用时,可以将其从缓存中删除并释放该对象的内存。
我可以使用MemoryCache但不幸的是我的键不是字符串,我不想将它们转换为字符串只是为了将它们存储在缓存中。(当 Microsoft 将 ObjectCache 限制为字符串键时,他们自己是怎么想的?)
所以,在用弱引用和可以与 IEqualityComparer 进行比较的键重新编写缓存类之前,我想确保这里没有遗漏任何东西......
我的问题是:
- 是否有更好的方法来处理(并存储在内存中)WCF 服务中的重复对象?
- 是否有一个好的(高效的、通用的、开放的)缓存实现我可以使用而不是重写一个?