我有以下類:Kryonet - 我如何在班上註冊課程?
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 **版本? –
使用'kryonet 2.21' – MrDuk
您的kryo實例中使用了哪種序列化策略?如果您的pojo不是有效的bean(沒有getter和setter),BeanSerializer可能會導致失敗,而JavaSerializer需要一個可序列化的pojo。 –