Kryonet - 如何在课堂上注册课程?

时间:2015-09-11 04:55:35

标签: java serialization network-programming 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);,一切都会顺利进行。但是,一旦我们开始实现更多高级类,包含许多类型的容器,这可能会很烦人。

我做错了吗?

1 个答案:

答案 0 :(得分:1)

如何使用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