2017-03-28 15 views
1

私はシリアライズする必要のあるライブラリコードをいくつか持っています。 1つのフィールドはインターフェースFooとして定義され、これは単にマーカーインターフェースです。クライアントコードは、Fooを実装するEnumを作成し、必要に応じてサブタイプリストを拡張できるようになっています。Gsonとのインタフェースを実装するEnumをシリアライズ

タイプアダプターでGsonでこれをシリアル化できません。私が手に例外は次のとおりです。

java.lang.IllegalStateException:未JSONオブジェクト:セットアップはクライアント列挙Barの一つの要素である "SETUP"

IはGson RuntimeTypeAdapterコード(GoogleのGsonヘルパー)を使用して、サブタイプとしてスーパータイプとBarとしてFoo定義TypeAdapterを追加しました。私が間違ってやっていることについてのアイデア、またはGsonによってサポートされていないこの種の構造ですか?

Fooを抽象クラスに、Setupをサブクラスにすることで回避できますが、enumは実際にはトークンであるため、少し劣ります。

+0

少なくとも、MCVEと使用しているGsonのバージョンのために例外スタックトレースを投稿するといいでしょう。 –

答えて

1

私は、Gsonがクラスを期待しているのに代わりにenumを取得しているため、この問題は関連していると思います。これはバグかもしれない、私はそれをより深く見なければならないだろう。

いずれにしても、問題の最良の解決策は、注釈のカスタムシリアライザ/デシリアライザを実装することだと思います。あなたのインターフェースでは、サブクラスがname()メソッドを実装する必要があります(これはenumであるため、既に実装しているはずです)。そして、それを呼び出してシリアル化を行います。ここで

は例です:

public class MyInterfaceSerializer implements JsonSerializer<MyInterface> { 

public JsonElement serialize(MyInterface src, Type typeOfSrc, 
     JsonSerializationContext context) { 

    return context.serialize(src.name()); 
} 

、デシリアライゼーションは基本的に同じですが、デシリアライザは(と同じクラスでなければなりませんでした)JsonDeserializerを実装して、列挙型のインスタンスを作成します。

+1

OPが取得したエラーを再現できましたか?私は、クラスマッピングも単一の列挙値も再現できませんでした。 –

+1

"Gsonはオブジェクトを期待していますが代わりに列挙型を取得します" enumはオブジェクトです –

+0

@LyubomyrShaydarivできませんでしたが、彼が使用しているGsonのバージョンはわかりません。 – Aurasphere

関連する問題