在 java 中正确处理类型层次结构的 RPC 机制
Posted
技术标签:
【中文标题】在 java 中正确处理类型层次结构的 RPC 机制【英文标题】:An RPC mechanism which handles type hierarchy correctly in java 【发布时间】:2013-09-29 13:30:35 【问题描述】:我需要一种在服务器上调用远程方法的机制,它可以正确处理类型层次结构。例如 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 可以毫无问题地处理这个问题,有没有其他技术可以处理这个问题?
【问题讨论】:
【参考方案1】:我没有找到用于此的 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);
【讨论】:
【参考方案2】:使用 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);
【讨论】:
以上是关于在 java 中正确处理类型层次结构的 RPC 机制的主要内容,如果未能解决你的问题,请参考以下文章