0

型階層を正しく処理するサーバー上でリモート メソッドを呼び出すためのメカニズムが必要です。たとえば、GWT はこれを実行できますが、私のクライアントは JavaScript ではありません! 型階層を処理するということは、型が親クラスとして宣言されている場合でも、子オブジェクトを転送することを意味します! クラス Container があるとします。

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

class Container {
   Parent p;
}

そして、サーバー上に次の署名を持つメソッドがあります。

void doSomethingImportant(Container c) {}

クライアントでこのメソッドを呼び出し、プロパティ "p" として Child のインスタンスを持つ Container のインスタンスを渡すと、サーバーでも Child のインスタンスを取得することが期待されます (これには "family" プロパティがあります)。GWT はこれを問題なく処理しますが、これを処理できる他のテクノロジはありますか?

4

2 に答える 2

0

このための RPC メカニズムは見つかりませんでしたが、JSON を使用してこれを処理することができました。JavaでJSONを使用するためのGoogleのAPIであるGsonを見つけました。オブジェクトを文字列として解釈できる 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;
}
}

次に、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 に答える