Java Kryonet--如何在类中注册类?
我有以下课程:Java Kryonet--如何在类中注册类?,java,serialization,network-programming,kryonet,Java,Serialization,Network Programming,Kryonet,我有以下课程: public class QueryResults { protected Set<String> resultList = new HashSet<String>(); protected long executionTime = 0; public long getExecutionTime() { return executionTime; } [...] } 如果我显式调用register.RegisterCla
public class QueryResults {
protected Set<String> resultList = new HashSet<String>();
protected long executionTime = 0;
public long getExecutionTime() { return executionTime; }
[...]
}
如果我显式调用register.RegisterClass(这是HashSet.class)代码>,一切都很顺利。然而,一旦我们开始使用许多类型的容器实现更高级的类,这可能会很烦人
我做错什么了吗?使用:
公共类查询结果{
@CollectionSerializer.BindCollection(
elementClass=QueryResults.class,
elementSerializer=DefaultSerializers.StringSerializer.class)
受保护的集合resultList=new HashSet();
...
}
还要检查一组。您正在使用哪个kryo版本?使用kryonet 2.21
在您的kryo实例中使用哪个序列化策略?如果您的pojo不是有效的bean(没有getter和setter),BeanSerializer可能会导致失败,而JavaSerializer需要一个可序列化的pojo。请尝试使用我的anwser中的代码片段。我想这不是每个收集字段都可以使用的选项,但它可能有助于调查。我还没有机会在我的场景中尝试这一点,但悬赏即将到期,所以我将继续,并将其奖励给您的答案。本周晚些时候,我会尝试用我的结果来回应。
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);
}
}
}
}
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);
public class QueryResults {
@CollectionSerializer.BindCollection(
elementClass = QueryResults.class,
elementSerializer = DefaultSerializers.StringSerializer.class)
protected Set<String> resultList = new HashSet<String>();
...
}