6

firebase 9.2.0+で自動値を使用したい。次のコードがあります。

@AutoValue
public abstract class Office {

    public static Builder builder() {
        return new AutoValue_Office.Builder();
    }

    public abstract double latitud();
    public abstract double longitud();

    @AutoValue.Builder
    public static abstract class Builder {

        public abstract Builder latitud(double latitud);
        public abstract Builder longitud(double longitud);

        public abstract Office build();

    }

}

しかし、これを呼び出すと、次のOffice office = childDataSnapshot.getValue(Office.class);エラーが発生します。

com.google.firebase.database.DatabaseException: No properties to serialize found on class com.example.app.model.Office

このエラーが発生する理由と解決方法を知っている人はいますか? jacksonfirebase がjson シリアライゼーションに使用されなくなったことを読みました。@JsonProperty("latitud")そのため、使用@PropertyNameに失敗した種類を指定する方法がわかりません。

また、抽象メソッドの名前を次のようpublic abstract double getLatitud();に変更しようとしましたが、その後、エラーは次のようになります:

java.lang.InstantiationException: Can't instantiate abstract class com.example.app.model.Office

したがって、これを解決する方法がわかりません。

解決

hatboysamFrank van Puffelenのおかげで、最終的に次の解決策でこの問題に直面することができました。

  1. hatboysam の回答とFrank van Puffelen のコメントに基づいて、Firebase のオブジェクトをシリアル化および逆シリアル化するための 2 つのメソッドを持つFirebaseUtil 列挙型を作成しました。
  2. Userテスト用にいくつかのPhoneクラスを作成します。
  3. 依存関係:

    compile 'com.fasterxml.jackson.core:jackson-annotations:2.8.0'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.8.0'
    
  4. 使用例:

    User user = FirebaseUtil.deserialize(dataSnapshot, User.class);
    Map<String, Object> map = FirebaseUtil.serialize(user);
    
4

2 に答える 2

0

AutoValue私はこれのための拡張機能を書きました:

https://github.com/mattlogan/auto-value-firebase

この拡張機能は、FirebaseValue生成された AutoValue クラスの静的内部クラスとして、 と呼ばれる firebase 互換クラスを生成します。生成されたコンストラクターを介して、AutoValueクラスとクラスの間で変換できます。FirebaseValue

readme からコピーした例を次に示します。

@AutoValue @FirebaseValue
public abstract class Taco {

  public static Taco create(String name, List<Ingredient> ingredients, Review review) {
    return new AutoValue_Taco(name, ingredients, review);
  }

  // Create AutoValue_Taco instance from AutoValue_Taco.FirebaseValue instance
  public static Taco create(DataSnapshot dataSnapshot) {
    AutoValue_Taco.FirebaseValue taco = dataSnapshot.getValue(AutoValue_Taco.FirebaseValue.class);
    return new AutoValue_Taco(taco);
  }

  // Create AutoValue_Taco.FirebaseValue instance from AutoValue_Taco instance
  public Object toFirebaseValue() {
    return new AutoValue_Taco.FirebaseValue(this);
  }

  public abstract String name();

  public abstract List<Ingredient> ingredients();

  public abstract Review review();
}
于 2016-08-13T16:50:06.290 に答える