0

クラスのオブジェクトをシリアル化しようとしています(MyClassとしましょう)

おおよそ MyClass.java は次のようになります。

public class MyClass {

    private static final AtomicInteger variableOne = new AtomicInteger();
    private static final AtomicInteger variableTwo = new AtomicInteger();
    private static final AtomicInteger variableThree = new AtomicInteger();
    private static final AtomicInteger variableFour = new AtomicInteger();


    /*
    * Have the getters and setters here
    */
}

GSONを使用して上記のクラスのオブジェクトをJSONに変換しようとしています

コードは次のとおりです。

GsonBuilder gsonBuilder  = new GsonBuilder();
gsonBuilder.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT);
Gson gson = gsonBuilder.create();
String jsonObject = gson.toJson(new MyClass());

ただし、次の例外がスローされます。

class java.util.concurrent.atomic.AtomicInteger declares multiple JSON fields named serialVersionUID

SOや他のフォーラムでの回答のほとんどが変数 TRANSIENT を作成するように求めているため、この問題に対処する方法がわかりません。これは基本的に私が達成したいことのアイデアではありません。

4

1 に答える 1

0

このような問題に遭遇する人のために、私は答えを見つけました:

GsonBuilder を FieldExcluder に登録します (FieldExtractor と名付けました)

GsonBuilder gsonBuilder = new GsonBuilder().setExclusionStrategies(new FieldExtractor()); 

FieldExcluder は次のようになります。

 private class FieldExtractor implements ExclusionStrategy {

            @Override
            public boolean shouldSkipClass(Class<?> arg0) {
                return false;
            }

            @Override
            public boolean shouldSkipField(FieldAttributes f) {

                if ("serialVersionUID".equals(f.getName())) {
                    return true;
                }

                return false;
            }

        }

基本的に、次の形式で例外を与えるフィールドは無視できます。

declares multiple JSON fields named serialVersionUID

要件に合わせて if 条件をさらに変更できます。

于 2016-10-25T16:58:52.697 に答える