web-dev-qa-db-ja.com

GSONがゲッター/セッターではなくフィールドを使用するのはなぜですか?

GSONが[〜#〜] only [〜#〜] fields(private、public、protected)を使用するのはなぜですか? GSONにゲッターとセッターのみを使用するように指示する方法はありますか?

71
Zemzela

一般的に、オブジェクトをシリアライズ/デシリアライズするときは、オブジェクトの状態の正確なコピーになるようにしています。そのため、通常、OOデザインで通常望まれるカプセル化を回避します。カプセル化を回避しないと、まったく同じオブジェクトを持つことができない場合がありますさらに、特定のプロパティにセッターを提供したくない場合を考えてみましょうゲッターとセッターを使用して作業している場合、シリアライズ/デシリアライズはどのように動作する必要がありますか?

90
Chris Shaffer

GSONにゲッターとセッターのみを使用するように指示する方法はありますか?

未だに。

設計ドキュメント から:

[T]プロパティをサポートするための適切な引数もあります。 Jsonフィールドを示すための代替マッピングとしてプロパティをサポートするために、後のバージョンでGsonを強化する予定です。今のところ、Gsonはフィールドベースです。

24

Gsonを ゲッターを使用 にパッチすることができます。

4
Jimmy

アプリでこれがどのように機能するかについてのあいまいな概要は、多くのTypeAdapter実装があることです。特定の値のようなオブジェクト用と、JavaBeansロジックが機能することがわかっているBeanスタイルオブジェクト用です。次に、GsonBuilderオブジェクトを作成する前に、これらすべてをGsonにジャムします。

残念ながら、GSONはObject[]。メソッドパラメータを表すJSONオブジェクトを作成しようとしたときに、主にこれを見ました。そのための回避策は、メソッドを反映するカスタムTypeAdapterインスタンスを作成することでした。 (つまり、呼び出すメソッドごとに1つのGsonインスタンスを使用することになります...)

0
Trejkaz