我目前正在開發瘦客戶端應用程序,通過JSON序列化的消息對象進行通信。服務器序列化消息,通過套接字發送,客戶端接收和反序列化。答案以同樣的方式發生。如何使用Gson在Java中反序列化和返回JSON中的對象而不必事先知道.class?
首先,讓我們假設消息類服務器和客戶端的定義兩者。
問題是Gson::fromJson
函數需要一個.class/type對象來反序列化通過自省(可以理解),但是在我的應用程序中,可以在不知道.class的情況下接收多種類型的對象。
我的想法是創建這樣一個消息包裝:
class MessageWrapper {
public class MessageWrapper(Object message, MessageType type) {
this.message = message;
this.type = type;
}
// getters...
public enum MesssageType {
PLACEMENT,
UPDATE,
// ...
}
private final Object message;
private final MessageType type;
}
甚至通過確定type
PARAM自省走得更遠。這個解決方案非常適合序列化(我重複一遍,這不是問題),但是在反序列化的時候,我會得到消息類型並且自己放棄消息,至少如果我不解析它兩次。通過Java「模板化」機制專門化MessageWrapper將我們帶回原始問題(我將有多個類可供選擇)。
另一個想法,就是送令牌識別消息,JSON字符串之前,如:
Placement={"foo": 2, "bar": "baz"}
然後讀取令牌來確定的.class類型。這可以工作,但仍然有一個問題:我將如何返回從我的receive
函數的值?我當然可以這樣做:
public Object receive(Reader stream) {}
,並強制用戶做一個垂頭喪氣,但我寧願避免它。
編輯:這是因爲客戶端有一個反應器樣結構:它在一個循環中運行,並且將信息分配到適當的處理程序。
你可以改變從服務器發送的結構?我的意思是通過使用另一個庫並在流中添加類型信息。 – eugen
我在生成的JSON中有類型信息,可以是字段(第一種情況)或類型令牌(後一種情況)。 –