2013-09-29 24 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);