java - 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之前,这个方法一直很有效,在本例中是aHashSet(我们也尝试了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 serialization network-programming kryonet

相关文章:

java - GCP Datastore Java API,使用空值构建实体

java - Spring Boot和Hibernate多次调用相同的方法

java - 为什么有BigInteger(String)但没有BigInteger(long)?

java - 向用户数据添加方法

java - 正则表达式,用于在Java中从右到左格式化二进制数字,每4个字符一个空格

java - 用于修复不平衡的live hbase集群的工具?

java - 获取按钮坐标并检测手指是否在他们身上 - Android

java - 难以捉摸的Java内存泄漏

java - 简单的方法获取对象中的非null字段值并将其设置为相同类的另一个对象

java - 将视频上传到Android中的服务器