web-dev-qa-db-ja.com

GsonとアクティブなAndroid:Java.lang.Classをシリアル化しようとしました。タイプアダプタの登録を忘れましたか?

Gsonを使用してアクティブなAndroidモデルをシリアル化します。モデルクラスにはプリミティブのみが含まれているため、Gsonはデフォルト設定でシリアル化しても問題ありません。ただし、試してみると、エラー:

Java.lang.UnsupportedOperationException: Attempted to serialize Java.lang.Class: <MyClass>. Forgot to register a type adapter?

モデルクラスのすべてに型アダプターを作成したくないのですが、どうすればこの問題を回避できますか?

16
GLee

理解した。もちろん、Active Androidの基本モデルクラスは、デフォルトではシリアル化できないフィールドを追加しています。これらのフィールドは、次のようにGsonのexcluedFieldsWithoutExposeAnnotation()オプションを使用して無視できます。

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
String json = gson.toJson(new Book());

@Exposeアノテーションを使用してクラスを変更し、シリアル化する必要があるフィールドを示します。

@Table(name = "Foo")
public class Foo extends Model {

    @Expose
    @Column(name = "Name")
    public String name;

    @Expose
    @Column(name = "Sort")
    public int sort;

    ...
}
23
GLee

より簡単な方法は、Gsonを以下のように初期化して、Final、Transient、またはStaticフィールドのシリアル化を防ぐことです。

Gson gson = new GsonBuilder()
            .excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC)
            .serializeNulls()
            .create();
14
mehdi