2013-09-29 56 views
0

我需要一種機制來調用服務器上正確處理類型層次結構的遠程方法。例如GWT可以做到這一點,但我的客戶端不是JavaScript!通過處理類型層次結構,即使在將類型聲明爲父類時,也是指傳遞子對象!假設我們有一個類容器:在java中正確處理類型層次結構的RPC機制

class Parent { 
    String name; 
} 
class Child extends Parent { 
    String family; 
} 

class Container { 
    Parent p; 
} 

而且我有以下簽名的服務器的方法:

void doSomethingImportant(Container c) {} 

如果我呼籲客戶此方法,並通過集裝箱,其中有一個實例Child的一個實例作爲屬性「p」,我希望在服務器上也獲得一個Child實例(這將具有「family」屬性)! GWT處理這個沒有任何問題,是否有任何其他技術可以處理這個問題?

回答

0

我沒有找到這種RPC機制,但我設法使用JSON來處理這個。我發現Gson是在Java中使用JSON的谷歌API。它將對象轉換爲可以被解釋爲字符串的JsonElements,反之亦然。因此,幫助我開發這一功能的關鍵特性是Gson的定製串行器/解串器。我實現了一個類,這是串行器和解串爲對象,我爲源類以及類的內容發送類名:

class MySerializerAndDeserializer implements JsonSerializer<Object>, JsonDeserializer<Object>{ 

public JsonElement serialize(Object src, Type typeOfSrc, 
     JsonSerializationContext context) { 
    Class clazz = src.getClass(); 
    JsonElement serialize = context.serialize(src); 
    JsonArray array = new JsonArray(); 
    array.add(new JsonPrimitive(clazz.getName())); 
    array.add(serialize); 
    return array; 
} 

public Object deserialize(JsonElement json, Type typeOfT, 
     JsonDeserializationContext context) throws JsonParseException { 
    JsonArray array = json.getAsJsonArray(); 
    String asString = array.get(0).getAsString(); 
    Object deserialize = null; 
    try { 
     deserialize = context.deserialize(array.get(1).getAsJsonObject(), Class.forName(asString)); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return deserialize; 
} 
} 

,然後我註冊MySerializerAndDeserializer爲Parent.class:

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(Parent.class, new MySerializerAndDeserializer()); 

最後用GSON,得到了我正確的預期實例:

String json = gson.toJson(container, Container.class); 
Container containerFromJson = gson.fromJson(json, Container.class); 
0

使用sfnrpc(http://code.google.com/p/sfnrpc),您可以指定哪些類型必須是使用d可選地在類參數中。 希望這有助於。

Object [] objArr = new Object[1]; 
TestObject to = new TestObject(); 
to.data = "HELLO,"; 
objArr[0] = to; 

**Class [] classArr = new Class[1]; 
classArr[0] = TestObject.class;** 

TestObject response = (TestObject)rpcc.invoke("#URN1","127.0.0.1:6878","echo",true,60,"", objArr,classArr); 
sl.debug("The response was:"+response.data);