5

例:

import com.google.gson.Gson;

class GsonDemo {

    private static class Static {String key = "static";}
    private class NotStatic {String key = "not static";}

    void testGson() {
        Gson gson = new Gson();

        System.out.println(gson.toJson(new Static()));
        // expected = actual: {"key":"static"}

        System.out.println(gson.toJson(new NotStatic()));
        // expected = actual: {"key":"not static"}

        class MethodLocal {String key = "method local";}
        System.out.println(gson.toJson(new MethodLocal()));
        // expected: {"key":"method local"}
        // actual: null  (be aware: the String "null")

        Object extendsObject = new Object() {String key = "extends Object";};
        System.out.println(gson.toJson(extendsObject));
        // expected: {"key":"extends Object"}
        // actual: null  (be aware: the String "null")        
    }

    public static void main(String... arguments) {
        new GsonDemo().testGson();
    }
}

特に単体テストでは、これらのシリアル化が必要です。そうする方法はありますか?Gsonを使用した匿名クラスのシリアル化を見つけましたが、引数は逆シリアル化にのみ有効です。

4

1 に答える 1

1

FWIW、ジャクソンは匿名クラスとローカルクラスをうまくシリアル化します。

public static void main(String[] args) throws Exception
{
  ObjectMapper mapper = new ObjectMapper();

  class MethodLocal {public String key = "method local";}
  System.out.println(mapper.writeValueAsString(new MethodLocal()));
  // {"key":"method local"}

  Object extendsObject = new Object() {public String key = "extends Object";};
  System.out.println(mapper.writeValueAsString(extendsObject));
  // {"key":"extends Object"}
}

ジャクソンはデフォルトでは、Gsonのようにリフレクションを介して非公開フィールドにアクセスしませんが、そうするように構成できます。ジャクソンの方法は、代わりに(get / setメソッドを介して)通常のJavaプロパティを使用することです。(プライベートフィールドを使用するように構成すると、実行時のパフォーマンスが少し低下しますが、それでもGsonよりもはるかに高速です。)

于 2013-04-03T06:12:35.340 に答える