0

我需要一种在服务器上调用远程方法的机制,它可以正确处理类型层次结构。例如 GWT 可以做到这一点,但我的客户端不是 javascript!通过处理类型层次结构,我的意思是即使将类型声明为父类,也要传输子对象!假设我们有一个类 Container:

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

class Container {
   Parent p;
}

我在服务器上有一个具有以下签名的方法:

void doSomethingImportant(Container c) {}

如果我在客户端调用此方法,并传递一个容器实例,它有一个 Child 实例作为属性“p”,我希望在服务器上也获得一个 Child 实例(它将具有“family”属性)!GWT 可以毫无问题地处理这个问题,有没有其他技术可以处理这个问题?

4

2 回答 2

0

我没有为此找到 RPC 机制,但我设法使用 JSON 来处理这个问题。我找到了 Gson,它是谷歌在 java 中使用 JSON 的 API。它将对象转换为可以解释为字符串的 JsonElements,反之亦然。所以帮助我开发这个的关键特性是 Gson 的自定义序列化器/反序列化器。我实现了一个类,它是 Object 的 Serializer 和 Deserializer,我将源类的类名与类的内容一起发送:

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);
于 2013-09-30T06:44:31.883 回答
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);
于 2013-10-23T13:47:34.003 回答