2015-09-11 34 views
4

我有以下類: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);,一切正常順順當當。然而,一旦我們開始實施更多高級類,並且有許多類型的容器,這可能會令人討厭。

我做錯了什麼?

+0

您正在使用哪個** kryo **版本? –

+0

使用'kryonet 2.21' – MrDuk

+0

您的kryo實例中使用了哪種序列化策略?如果您的pojo不是有效的bean(沒有getter和setter),BeanSerializer可能會導致失敗,而JavaSerializer需要一個可序列化的pojo。 –

回答

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

+0

我還沒有機會爲我的場景嘗試這個,但賞金將會過期,所以我會繼續並將其獎勵給您的答案。我會盡力在本週晚些時候回覆我的結果。 – MrDuk