java - Kryonet——我如何在我的类(class)内注册类(class)?

标签 java serialization network-programming kryonet

我有以下类(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/

相关文章:

c# - 恶霸算法

java - Active Directory : User UPN or DN for NTLM name, 使用纯 LDAP?

java - 线程 "main"java.lang.StringIndexOutOfBoundsException : String index out of range: 7 中的异常

java - 如何确定控制台窗口中是否输入了任何内容?

c++ - 结构序列化

c# - 使用 C#,如何知道文件夹是否位于网络上

JavaFX Canvas 双缓冲

java - 使用 Jackson 自定义 POJO 序列化

c# - 使用不同的名称对 Json.Net 进行序列化和反序列化

windows - winsock 周围的 BSD 套接字兼容包装器?