日期:2014-05-17  浏览次数:20884 次

如何得到“某个类型的所有实例”
目的是做全局缓存用,本来思路是在创建对象时记录在静态变量里,但在反序列化时缓存信息就丢了无法通过它来获取a类型的所有实例。甚至反序列化时连构造函数都不能保证被调用了。

有没有其他思路实现题目里的需求呢?

class a
{
    static Dictionary<string, a> buffer;

    public static CreateA(string guid){
        ....
        buffer[guid]=result;
    }

    a();
}


------解决方案--------------------
构建可缓存项基类,使其实现ISerializable接口,在此对象中添加包含SerializationInfo info, StreamingContext context的构造函数(提供给反序列化使用),在此构造函数内部实现通知你那缓存的逻辑。
exp
abstract class BaseCacheableObject:ISerializable
{
 protected BaseCacheableObject(SerializationInfo info,StreamingContext context)
 {
   //notify your cache logic here
   BuildObjectInternal(info,context);
  }
  abstract void BuildObjectInternal(SerializationInfo info,StreamingContext context);
 abstract void GetObjectData(SerializationInfo info, StreamingContext context);
}
------解决方案--------------------
楼上的方法恐有问题哦?
Test实例对象在构造时已放到 静态 Instances 实例集合,由于一直被Instances引用,恐怕不会执行~Test方法哦,因此也就无法 Remove 最好测试一下.

------解决方案--------------------
/// <summary>
/// 此类负责创建 Target 类的实例,并提供缓存、检索、序列化和反序列化服务。
/// 此类采用单例模式,以确保全局唯一性。
/// </summary>
public class Creator
{
}

/// <summary>
/// 此类为要全局缓存的类,构造函数限定为internal,并与 Creator 在同一个程序集中。
/// 需要 Target 实例时只能从Creator 的缓存中获取。
/// </summary>
[Serializable()]
public class Target
{
    internal Target()
    { 
    
    }
}

通过以上方式,可以避免构造函数和析构函数的问题。
若将Creator以泛型的方式实现,可以考虑写一个通用的缓存类。
------解决方案--------------------
.net有很好的缓存框架 System.Web.Caching.Cache。

你不过是弄个“容器”,这不叫做缓存。真正的缓存机制最重要地是各种能够自动清除缓存单元(避免个别数据变成脏数据)的机制。

缓存中的数据随时都会自动清除。你还纠结于“反序列化之后没有数据了”?这更加证明你纠结的就是保存脏数据而不释放,而不是缓存。