gpt4 book ai didi

java - EhCache磁盘持久化——持久化任意对象

转载 作者:行者123 更新时间:2023-12-02 02:39:58 25 4
gpt4 key购买 nike

我想使用 EhCache 将对象保存在磁盘上,因此下次运行我的应用程序时,它将从中加载。在他们的文档中,有以下使用 PersistentCacheManager 类来执行此操作的示例:

PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder().with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData"))).withCache("persistent-cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder().disk(10, MemoryUnit.MB, true))).build(true);
persistentCacheManager.close();

该示例工作正常,但如果 CacheConfigurationBuilder 对象定义硬编码为 Long 和 String 的键和值的类,那么对我来说就是问题。我想保留仲裁类的实例,而不是预定义哪些实例。此外,例如,CacheConfigurationBuilder 不会采用 Object.class 或 HashMap.class。

如何使用 EhCache 将任意实例类保留在磁盘上?

最佳答案

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));
}

}

关于java - EhCache磁盘持久化——持久化任意对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45663526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com