如何解决 ignitecheckedexception:确保缓存配置中的所有对象都是可序列化的
how to resolve ignitecheckedexception: make sure all objects in cache configuration are serializable
我是 运行 Ignite Spring Boot.My 目的是在 Ignite 中对 BinaryObject 执行 SqlFieldQuery 提到我没有任何实体 class,在运行时创建实体通过使用 QueryEntity。这是我的以下代码:
CacheConfiguration<Integer, BinaryObject> cachecfg = new CacheConfiguration<>();
cachecfg.setQueryEntities(new ArrayList<QueryEntity>()
{
{
QueryEntity e = new QueryEntity();
e.setKeyType("java.lang.Integer");
e.setValueType("BinaryTest");
e.setFields(new LinkedHashMap<String, String>() {
{
put("name", "java.lang.String");
}
});
add(e);
}
});
cachecfg.setName("MY_CACHE");
IgniteCache<Integer, BinaryObject> ignitecache = igniteInstance.createCache(cachecfg).withKeepBinary();
BinaryObjectBuilder builder = igniteInstance.binary().builder("BinaryTest");
builder.setField("name", "Test");
ignitecache.put(1, builder.build());
QueryCursor<List<?>> query = ignitecache.query(new SqlFieldsQuery("select name from BinaryTest"));
System.out.println(query.getAll());
当我运行这段代码时,它得到错误:
class org.apache.ignite.IgniteCheckedException: Failed to validate cache
configuration (make sure all objects in cache configuration are
serializable): MY_CACHE
我可能缺少 serialization.Is 的某些配置,有什么问题吗?
摆脱双括号初始化,在这种情况下,您最终得到一个匿名 class,它是具有实例初始化程序的 ArrayList 的子class。匿名 classes 始终包含对封闭 class 的引用,在您的情况下,它试图被序列化。
所以选择:
CacheConfiguration<Integer, BinaryObject> cachecfg = new CacheConfiguration<>();
QueryEntity e = new QueryEntity();
e.setKeyType("java.lang.Integer");
e.setValueType("BinaryTest");
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
map.put("name", "java.lang.String");
e.setFields(map);
ArrayList<QueryEntity> list = new ArrayList<QueryEntity>();
list.add(e);
cachecfg.setQueryEntities(list);
cachecfg.setName("MY_CACHE");
IgniteCache<Integer, BinaryObject> ignitecache = igniteInstance.createCache(cachecfg).withKeepBinary();
我是 运行 Ignite Spring Boot.My 目的是在 Ignite 中对 BinaryObject 执行 SqlFieldQuery 提到我没有任何实体 class,在运行时创建实体通过使用 QueryEntity。这是我的以下代码:
CacheConfiguration<Integer, BinaryObject> cachecfg = new CacheConfiguration<>();
cachecfg.setQueryEntities(new ArrayList<QueryEntity>()
{
{
QueryEntity e = new QueryEntity();
e.setKeyType("java.lang.Integer");
e.setValueType("BinaryTest");
e.setFields(new LinkedHashMap<String, String>() {
{
put("name", "java.lang.String");
}
});
add(e);
}
});
cachecfg.setName("MY_CACHE");
IgniteCache<Integer, BinaryObject> ignitecache = igniteInstance.createCache(cachecfg).withKeepBinary();
BinaryObjectBuilder builder = igniteInstance.binary().builder("BinaryTest");
builder.setField("name", "Test");
ignitecache.put(1, builder.build());
QueryCursor<List<?>> query = ignitecache.query(new SqlFieldsQuery("select name from BinaryTest"));
System.out.println(query.getAll());
当我运行这段代码时,它得到错误:
class org.apache.ignite.IgniteCheckedException: Failed to validate cache
configuration (make sure all objects in cache configuration are
serializable): MY_CACHE
我可能缺少 serialization.Is 的某些配置,有什么问题吗?
摆脱双括号初始化,在这种情况下,您最终得到一个匿名 class,它是具有实例初始化程序的 ArrayList 的子class。匿名 classes 始终包含对封闭 class 的引用,在您的情况下,它试图被序列化。
所以选择:
CacheConfiguration<Integer, BinaryObject> cachecfg = new CacheConfiguration<>();
QueryEntity e = new QueryEntity();
e.setKeyType("java.lang.Integer");
e.setValueType("BinaryTest");
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
map.put("name", "java.lang.String");
e.setFields(map);
ArrayList<QueryEntity> list = new ArrayList<QueryEntity>();
list.add(e);
cachecfg.setQueryEntities(list);
cachecfg.setName("MY_CACHE");
IgniteCache<Integer, BinaryObject> ignitecache = igniteInstance.createCache(cachecfg).withKeepBinary();