2016-05-19 5 views
13

私は列挙型を利用してこのクラスを持っています。 Firebase jsonへの解析はジャクソンを使ってうまく動作していました。 firebase-データベースへの移行中:9.0.0私は、次を得る:Android firebase 9.0.0列挙型をシリアル化するsetValue

com.google.firebase.database.DatabaseException:クラスで見つかったシリアル化するためにはプロパティ.... MyClassの$カインド

ここで、Kindはenumで宣言された型です。クラス:

public class MyClass { 

    public enum Kind {W,V,U}; 

    private Double value; 
    private Kind kind; 

    /* Dummy Constructor */ 
    public MyClass() {} 

    public Double getValue() { 
     return value; 
    } 

    public void setValue(Double value) { 
     this.value = value; 
    } 

    public Kind getKind() { 
     return kind; 
    } 

    public void setKind(Kind kind) { 
     this.kind = kind; 
    } 
} 

setValue(new MyClass())をシリアル化するとき、FirebaseがJacksonを使用しなくなると思われます。

enum型をシリアル化する方法はありますか?または、シリアライザメソッドに関して明示的に使用する手段がありますか?

+1

私は明らかに長期的な解決策ではない答えを受け入れる再考したいです。もはやジャクソンをインポートする必要がないのは良いことですが、私たちは多くの人が必要としない光沢のある新機能のコードを管理していません。 Firebaseを使用してSDKを介してJSONシリアライザを設定できるようになるまでは、現時点で許容できる解決策はないと主張します。 –

答えて

15

Firebaseデータベースでは、シリアライゼーションやデシリアライズにJacksonが使用されなくなりました。このことによりFirebaseに話をするときは、文字列として、あなたの列挙型を表すことができ

:ちょうどアンドロイドで答え を最適化する側として

public class MyClass { 

    public enum Kind {W,V,U}; 

    private Double value; 
    private Kind kind; 

    /* Dummy Constructor */ 
    public MyClass() {} 

    public Double getValue() { 
     return value; 
    } 

    public void setValue(Double value) { 
     this.value = value; 
    } 

    // The Firebase data mapper will ignore this 
    @Exclude 
    public Kind getKindVal() { 
     return kind; 
    } 

    public String getKind() { 
     // Convert enum to string 
     if (kind == null) { 
      return null; 
     } else { 
      return kind.name(); 
     } 
    } 

    public void setKind(String kindString) { 
     // Get enum from string 
     if (kindString == null) { 
      this.kind = null; 
     } else { 
      this.kind = Kind.valueOf(kindString); 
     } 
    } 
} 
+1

ありがとうございました!私はnullチェックを追加しました。また、Kind.valueOfの完全性のために、IllegalArgumentExceptionを検証する必要があります。しかし、何をすべきかの意図はここでは異なるかもしれません。 – rmarau

+0

ヌルチェックを追加しました。ありがとうございます!これがあなたのために働いた場合、回答を受け入れたものとしてマークできますか? –

+0

答えをいただきありがとうございます。ジャクソンのシリアル化が削除された理由は誰にも分かりますか?それはかなり便利だった... –

2

を、列挙型を使用しないことをお勧めします。 @StringDefまたは@IntDefを使用すると、回避策なしで動作し、メモリを最適化することができます。

非常に素晴らしいビデオ推論理由:https://www.youtube.com/watch?v=Hzs6OBcvNQE