57

Gson ユーザー ガイドでは、Gson を適切に操作するには、クラスのデフォルトの引数なしコンストラクターを定義する必要があると述べています。さらに、Gson のクラスのjavadocInstanceCreatorでは、デフォルト コンストラクターが欠落しているクラスのインスタンスを逆シリアル化しようとすると例外がスローされると述べられており、そのような場合に使用する必要がInstanceCreatorあります。ただし、デフォルトのコンストラクターがないクラスで Gson の使用をテストしようとしましたが、シリアライゼーションとデシリアライゼーションの両方が問題なく動作します。

デシリアライゼーションのコードは次のとおりです。非引数コンストラクターのないクラス:

public class Mushroom {
    private String name;
    private double diameter;

    public Mushroom(String name, double diameter) {
        this.name = name;
        this.diameter = diameter;
    }

    //equals(), hashCode(), etc.
}

そしてテスト:

@Test
public void deserializeMushroom() {
    assertEquals(
            new Mushroom("Fly agaric", 4.0),
            new Gson().fromJson(
                    "{name:\"Fly agaric\", diameter:4.0}", Mushroom.class));
}

これは正常に動作します。

だから私の質問は、デフォルトのコンストラクターを必要とせずに実際にGsonを使用できますか、それとも機能しない状況がありますか?

4

3 に答える 3

0

ここで説明されているように、 Jacksonライブラリには適切な解決策があります。

https://stackoverflow.com/a/11838468/2854723

ポイントは、 Mix-Ins 機能を介してシリアライザーに、引数付きのコンストラクターを使用するときに使用する JSON フィールドを伝えることです。

そのエンティティが外部ライブラリの一部である場合は、Creator 機能を使用して「リモート アノテーション」を実行できます。

于 2015-03-20T15:27:12.493 に答える