【问题标题】:Does C#/.Net MemoryCache class need to serialize/deserialize objectsC#/.Net MemoryCache 类是否需要序列化/反序列化对象
【发布时间】:2016-08-17 13:56:17
【问题描述】:

在 Redis/MemCache 等缓存系统中,需要对对象进行序列化和反序列化。在存储对象时,需要序列化,而在访问该对象时,需要反序列化。

C#/.Net MemCache 是否也需要序列化/反序列化对象?例如当我存储以下类的对象时,只是在缓存中设置了对象引用,还是在存储到缓存之前对对象进行了序列化?测试表明缓存只是存储一个引用。但我想检查一下。

class CacheData
{
    public int A = 0;
    public int B = 0;
}

private static void TestMemoryCache()
{
    CacheData origObject = new CacheData();
    ObjectCache cache = MemoryCache.Default;
    CacheItemPolicy policy = new CacheItemPolicy();
    cache.Set("someKey", origObject, policy);
    origObject.A = 2;
    origObject.B = 3;
    CacheData cachedObj = cache["someKey"] as CacheData;

    if (cachedObj == origObject)
        Console.WriteLine("Same");
    else
        Console.WriteLine("Distinct");

    cachedObj.A = 5555;

    cachedObj = cache["someKey"] as CacheData;
    Console.WriteLine("The A value is: " + cachedObj.A);


}

【问题讨论】:

    标签: c# .net serialization


    【解决方案1】:

    我无法立即在文档中找到任何明确说明对象是否被序列化的内容,除非这就是他们所说的“对象缓存”的意思。在实践中,对象没有序列化,只是按原样保存在内存中。

    您可以通过阅读参考源来验证此行为。虽然当前的实现并不能保证未来的行为,但将实现更改为使用序列化可能会在很多方面破坏事情,我认为可以肯定地说它不会改变。

    相关参考来源链接:

    https://github.com/Microsoft/referencesource/blob/master/System.Runtime.Caching/System/Caching/MemoryCache.cs

    https://github.com/Microsoft/referencesource/blob/master/System.Runtime.Caching/System/Caching/MemoryCacheStore.cs

    【讨论】:

    • 我需要一个序列化/反序列化的缓存存储。我一直在使用普通的旧字典进行内存缓存;效果很好。一些现有代码正在使用 MemoryCache。想过探索它。虽然对于简单的存储/获取使用,我看不到 MemoryCache 给我买了什么......也许过期了。
    • @Amit:过期、每个项目的优先级、线程安全、多种类型的依赖关系、一些对限制大小的支持等。如果您不需要这些,字典就可以了。
    • 我看不出它如何可以是线程安全的。如果它正在存储一个引用,那么两个单独的线程可以从缓存中获取一个对象,并修改该对象,可能会破坏它。如果缓存类似于 MemCache/Redis,那么可以将其设为线程安全,get() 获取一份副本,修改该副本,然后将 stores() 返回。但我看到存储对象是线程安全的;普通字典必须管理它。
    • @Amit:线程安全意味着您不能破坏缓存本身,确保您的对象不会损坏是您的责任。最好尝试保持缓存对象不可变。
    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多