Ehcache可以取任何鍵或值。默認情況下,它要求它們必須是可序列化的。否則,它無法知道如何將它存儲在磁盤或磁盤上。
HashMap
是可序列化的,所以你不會從中得到警告。 Map
不是。所以你會得到一個警告,但如果實現實際上是可序列化的,它仍然可以工作。
但是,如果你確實存儲了一個對象而不是可序列化的,你確實會得到一個異常。解決方案是指定一個鍵和/或值序列化程序,告訴Ehcache如何存儲任何你想要的。完整的文檔是there。
現在我們來看一個例子。您需要緩存的課程MyClass
。
public class MyClass {
private String value;
public MyClass(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public boolean equals(Object o) {
if(this == o) { return true; }
if(o == null || getClass() != o.getClass()) { return false; }
MyClass myClass = (MyClass) o;
return Objects.equals(value, myClass.value);
}
@Override
public int hashCode() {
return value != null ? value.hashCode() : 0;
}
}
而且一個測試,確保它的工作。
@Test
public void test() {
try(CacheManager persistentCacheManager =
newCacheManagerBuilder()
.withCache("test-cache",
newCacheConfigurationBuilder(Integer.class, MyClass.class,
newResourcePoolsBuilder().offheap(1, MemoryUnit.MB)))
.withSerializer(MyClass.class, MySerializer.class)
.build(true)) {
Cache<Integer, MyClass> cache = persistentCacheManager.getCache("test-cache", Integer.class, MyClass.class);
cache.put(1, new MyClass("test"));
MyClass actual = cache.get(1);
assertEquals("test", actual.getValue());
}
}
您的序列化器將是這樣的:
public class MySerializer implements Serializer<MyClass> {
public MySerializer(ClassLoader unused) {
}
@Override
public ByteBuffer serialize(MyClass object) throws SerializerException {
try(ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream oout = new ObjectOutputStream(bout)) {
oout.writeUTF(object.getValue());
oout.flush();
return ByteBuffer.wrap(bout.toByteArray());
} catch (IOException e) {
throw new SerializerException(e);
}
}
@Override
public MyClass read(ByteBuffer binary) throws ClassNotFoundException, SerializerException {
try(ObjectInputStream oin = new ObjectInputStream(new ByteBufferInputStream(binary))) {
return new MyClass(oin.readUTF());
} catch (IOException e) {
throw new SerializerException(e);
}
}
@Override
public boolean equals(MyClass object, ByteBuffer binary) throws ClassNotFoundException, SerializerException {
return object.equals(read(binary));
}
}
按照[文檔](http://www.ehcache.org/apidocs/3.0.3/org/ehcache/config/builders /CacheConfigurationBuilder.html#newCacheConfigurationBuilder-java.lang.Class-java.lang.Class-org.ehcache.config.Builder-)鍵和值可以是任何類型 - 示例使用Long和String,但這並不意味着你只能使用這些類型! – alfasin
類型Object或HashMap導致運行時異常,表明該類型不可調整。 –
然後使用可序列化的類型;) – alfasin