2016-07-08 13 views
6

auto-valuefirebase 9.2.0+を使いたいです。私は、次のコードを持っている:Androidでfirebase 9.2でauto-valueを使用する方法

@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 

誰かが、私はこのエラーを取得し、どのようにそれを解決することになっている理由のアイデアを持っていますか?私は、firebaseがもはやjacksonをjsonのシリアル化に使用していないと読んでいます。だから私は@JsonProperty("latitud")の種類を指定する方法がわかりません@PropertyNameが失敗しました。

私もpublic abstract double getLatitud();のような抽象メソッドの名前を変更しようと、それ以降のエラーは、次のいずれかです。

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

だから私はこの問題を解決する方法がわからないです。私は最終的に次の溶液を用いてこの問題に直面する可能性hatboysamフランク・バンPuffelen

SOLUTION

感謝。

  1. 私は、シリアル化のための二つの方法でFirebaseUtil enumを作成し、hatboysam答えとフランク・バンPuffelenコメントに基づいてFirebaseのためのオブジェクトをデシリアライズします。
  2. 私は、テストのためにいくつかのクラスをUserPhoneのクラスを作成します。
  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); 
    
+0

一つの質問:自動値を使用しての背後にある目的は何であることがどのように見えるの

はここで、readmeファイルからコピーされ、一例ですか?パーセルブルを作るため? –

答えて

4

私はこれがデフォルトFirebaseデータマッパーで可能ですわからないんだけど、可能な回避策があります。まず、あなたが見ているエラーを説明しましょう:

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

FirebaseマッパーがpublicフィールドやgetFoo/setFooパターンに名前付きフィールドのいずれかを探します。したがって、あなたのクラスでは、マッパーはどんな特性も見ません。

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

これはあなたが困っていると思います。逆シリアル化を機能させるには、マッパーがリフレクション(newInstance())を呼び出して呼び出すことができる、引数のないコンストラクターが必要です。私が知る限り、これはAutoValueの仕組みではありません。

しかし、希望を失うことはありません!this github issueによれば、@JsonCreatorアノテーションを使用してJacksonとAutoValueを互換性を持たせる方法があります。だから、ジャクソンとFirebaseの両方を使ってここで仕事をやる必要があります。

シリアライズ:

// Convert to a Map<String,Object> using Jackson and then pass that to Firebase 
ObjectMapper mapper = new ObjectMapper(); 
Map<String, Object> map = mapper.convertValue(office, Map.class); 
databaseReference.setValue(map); 

をデシリアライズ:拡張子がと呼ばれる、firebase互換のクラスを生成

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

// Use Firebase to convert to a Map<String,Object> 
GenericTypeIndicator<Map<String,Object>> t = new GenericTypeIndicator<Map<String,Object>>() {}; 
Map<String,Object> map = dataSnap.getValue(t); 

// Use Jackson to convert from a Map to an Office object 
ObjectMapper mapper = new ObjectMapper(); 
Office pojo = mapper.convertValue(map, Office.class); 
+0

ええ、申し訳ありませんが、私が読むことができた/研究ファイアベースがもうジャクソンを使用していないので、私はその回避策をうまくやっていないと言いました。だから、この回避策は私のために働いていません:/ – epool

+0

@epoolその回避策についてはどういうことがあなたにとってうまくいかないのですか? Firebaseは内部的にJacksonを使用しませんが、FirebaseのコンパニオンとしてJacksonを使用することはできます。 –

+0

最新のFirebase SDKでJacksonを使用する方法については、http://stackoverflow.com/questions/37547399/how-to-deserialise-a-subclass-in-firebase-using-getvaluesubclass-class/37548330#37548330 –

0

私はこのためAutoValue拡張を書きました210、生成されたAutoValueクラスの静的な内部クラスとして。生成されたコンストラクタを使用して、AutoValueクラスとFirebaseValueクラスを変換できます。

@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(); 
} 
+1

ニース!非常に良い音!この週末の男、いい仕事を見てみましょう! :) – epool

関連する問題