HashSet<Skill> tmp = new HashSet<Skill>();
tmp.add(Skill.WOODCUTTING);
tmp.add(Skill.FIREMAKING);
String j;
System.out.println(j = new GsonBuilder().create().toJson(tmp));
System.out.println(new GsonBuilder().create().fromJson(j, HashSet.class));
for (Object e : new GsonBuilder().create().fromJson(j, HashSet.class)) {
System.out.println(e.getClass());
System.out.println(e.toString());
}
スキルがenumはそうのように定義された文字列として、それをデシリアライズ:GSONが正しく列挙型をシリアル化ですが、
@SerializedName("w") WOODCUTTING("Woodcutting"),
@SerializedName("m") MINING("Mining"),
@SerializedName("f") FISHING("Fishing"),
上記のコードの出力:
[11:04:18 INFO]: ["fir","w"]
[11:04:18 INFO]: [w, fir]
[11:04:18 INFO]: class java.lang.String
[11:04:18 INFO]: false
[11:04:18 INFO]: w
[11:04:18 INFO]: class java.lang.String
[11:04:18 INFO]: false
[11:04:18 INFO]: fir
することができますようにそれはまずGsonを適切に構築しますが、列挙型ではなく文字列として逆直列化するように見えます。私はここで何が起こっているのか少し失われています - デフォルトでGsonによってサポートされている列挙型ではありませんか?
また、列挙型のシリアル化/逆シリアル化を行うTypeAdapterFactoryの登録も試みました。作成するTypeAdapterのwrite()メソッドは呼び出されますが、read()メソッドは決して呼び出されません。
Java Beanを作成し、その中に逆シリアル化してみます。さもなければ、これはうまくいかず、gsonはその文字列があなたのEnumであると理解できません。 –
申し訳ありませんが、私はJava Beanという用語にあまり慣れていません。それは、私の列挙型の1つの変数を持つクラスを作成し、それを逆シリアル化するということですか? GsonのJavaDocによると、 "Gsonは、Enum、Map、URL、URI、Locale、Date、BigDecimal、およびBigIntegerクラスのデフォルトの直列化と非直列化を提供しています。デフォルトの表現を変更したい場合は、 GsonBuilder.registerTypeAdapter(Type、Object)を通して。 "なぜ私は余分なステップを経なければならないのですか? – misaka