我需要一种在服务器上调用远程方法的机制,它正确处理类型层次结构。例如GWT可以做到这一点,但我的客户端不是javascript!通过处理类型层次结构,我的意思是即使将类型声明为父类,也可以传输子对象!假设我们有一个类Container:
class Parent {
String name;
}
class Child extends Parent {
String family;
}
class Container {
Parent p;
}
我在服务器上有一个带有以下签名的方法:
void doSomethingImportant(Container c) {}
如果我在客户端上调用此方法,并传递一个Container的实例,其实例为Child作为属性“p”,我希望在服务器上也获得Child的实例(这将具有“family”属性) ! GWT处理这个问题没有任何问题,还有其他技术可以解决这个问题吗?
答案 0 :(得分:0)
我没有为此找到RPC机制,但我设法使用JSON来处理这个问题。我发现Gson是谷歌在Java中使用JSON的API。它将对象转换为JsonElements,可以将其解释为字符串,反之亦然。 因此,帮助我开发这个功能的关键功能是Gson的定制Serializer / Deserializer。我实现了一个类,它是Serializer和Deserializer for Object,我在类的内容中发送源类的类名:
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;
}
}
然后我为Parent.class注册了MySerializerAndDeserializer:
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);
答案 1 :(得分:0)
使用sfnrpc(http://code.google.com/p/sfnrpc)可以指定必须在类参数中使用哪种类型。 希望这会有所帮助。
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);