我有以下类(class):
public class QueryResults {
protected Set<String> resultList = new HashSet<String>();
protected long executionTime = 0;
public long getExecutionTime() { return executionTime; }
[...]
}
然后我这样注册:
Registrar.RegisterClass(this, QueryResults.class);
------------
public class Registrar {
public static void RegisterClass(Node n, Class theClass) {
Map<String, Node> nodeMap = Node.getNodeMap();
for (Map.Entry<String, Node> node : nodeMap.entrySet()) {
if (node.getKey().equals(n.getHostname())) {
Log.info("Registering " + theClass.getSimpleName() + " for " + node.getValue().getHostname());
node.getValue().getServer().getConnection().getKryo().register(theClass);
node.getValue().getClient().getConnection().getKryo().register(theClass);
}
}
}
}
这在尝试序列化 QueryResults
之前一直运行良好,因为它包含一个容器,在本例中是一个 HashSet
(我们尝试了一个 ArrayList
同样,结果相同)。
在端点填充并最终序列化此类以发送回调用者时,我得到以下输出:
Exception in thread "Server" com.esotericsoftware.kryo.KryoException: java.lang.IllegalArgumentException: Class is not registered: java.util.HashSet Note: To register this class use: kryo.register(java.util.HashSet.class);
如果我显式调用 Registrar.RegisterClass(this, HashSet.class);
,一切都会顺利进行。然而,一旦我们开始使用多种类型的容器实现更高级的类,这可能会很烦人。
我做错了什么吗?
最佳答案
如何使用 kryo bind annotations :
public class QueryResults {
@CollectionSerializer.BindCollection(
elementClass = QueryResults.class,
elementSerializer = DefaultSerializers.StringSerializer.class)
protected Set<String> resultList = new HashSet<String>();
...
}
同时检查一组 additional kryo serialisers .
关于java - Kryonet——我如何在我的类(class)内注册类(class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32515737/