2016-07-30 4 views
8

をリストを使用してください私は、次のコードを使用してカスタムオブジェクトを永続化しようとしています:com.google.firebase.database.DatabaseException:配列のシリアル化がサポートされていない、代わりに

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference curWorkoutExercisesRef = databaseReference.child("workouts") 
      .child(mCurrentWorkout.getId()) 
      .child("workoutExercises"); 

WorkoutExercise we = new WorkoutExercise(exercise); 
curWorkoutExercisesRef.push().setValue(we); 

は、ここに私のオブジェクトです:

com.google.firebase.database.DatabaseException: Serializing Arrays is not supported, please use Lists insteadから
public class WorkoutExercise { 

    private String id; 
    private Exercise exercise; 

    public WorkoutExercise() {} 

    // getters, setters, other methods 
    // ... 
} 

public class Exercise { 

    private String id; 
    private String title; 

    private List<BodyPart> bodyParts; 

    public Exercise() {} 

    // getters, setters, other methods 
    // ... 
} 

public class BodyPart { 

    private String id; 
    private String name; 

    public BodyPart() {} 

    // getters, setters, other methods 
    // ... 
} 

そして毎回、私はこのエラーを取得しています。オブジェクトに配列が含まれていないので、このエラーはかなり混乱しています。私はこのエラーを修正する方法を発見した - 私は私のExerciseクラスからbodyPartsリストに@Exclude注釈を追加しますが、それは私が達成しようとしているものを明らかでない場合はすべてが正常に動作します。

のでFirebaseは、内側のリストを含むオブジェクトを永続化することができないようですか?ここには簡単な回避策やベストプラクティスがありますか?ありがとう!

P.S.私はこのクラッシュの原因となる理由を見つけることができたfirebase-database:9.2.1

+3

'firebase-database:9.2.1'で実行しているときに例外を再現することはできません。別のバージョンを使用していますか? –

+1

@ qbix好奇心から:データベースに 'List 'をシリアル化すると、どんなJSONが完成しますか? –

+1

@FrankvanPuffelen:リストは配列としてシリアル化されます。 [JSONはこちら](https://gist.github.com/Bob-Snyder/034685d998fddd8d1bcc3d52c93d1877) –

答えて

7

を使用しています。私は、Androidの5.xを実行している別のデバイスにアプリをインストールしてFirebaseがはるかに少ない混乱例外をスロー:

com.google.firebase.database.DatabaseException: No properties to serialize found on class android.graphics.Paint$Align 

Firebase(Gsonとは異なり)は、彼らがドンにもかかわらず、すべての可能なゲッターをシリアル化しようとする登場しました」 getDrawable() - Tグローバル変数(クラスのメンバー/フィールド)との直接接続は、私の特定のケースでは、私の目的の一つは、Drawableを返すメソッドを含んでいました。明らかに、Firebaseはdrawableをjsonに変換する方法を知らない。

興味深い瞬間(Firebase SDKでおそらくバグ):私の古いデバイス私はまだ、同じプロジェクトや構成に私の元の例外を取得アンドロイド4.4.1を実行している上:

Caused by: com.google.firebase.database.DatabaseException: Serializing Arrays is not supported, please use Lists instead 
+0

これは正解です..素晴らしい –

1

私は同様の問題を抱えていました、私はJavaのかわりにグルーヴィー使用しようとしていた、私はグルーヴィーは私のために他のgetメソッドを生成していることを推測します。私はPOJO(SRC /メイン/ javaの)にポゴ(グルーヴィー/ srcに/メイン)から自分のドメインクラスを変換し、現在すべてうまく

0

を働いている、あなたのクラスに

@IgnoreExtraProperties 
public class YourPojo { 
    public String name; 

    // Default constructor for Firebase 
    public YourPojo(){} 

    // Normal constructor 
    public YourPojo(String name) { 
     this.name = name; 
    } 
} 
1

を@IgnoreExtraPropertiesを追加する@Excludeを追加しますFBが解釈しようとする機能、Drawableを返す機能など。

@Exclude 
public Drawable getUnitColorImage(){ 
    return TextDrawable.builder().buildRound("", prefColor); 
} 
0

これはどのように解決されたのですか。 データベースのintフィールドを更新しようとしたときに問題が発生しました。テキストフィールドを編集してテキストを取得していて、それをint型に変換するのを忘れてしまった。これにより、障害が発生しました。この問題が発生した場合は、データベースに送信するデータ型を確認してみてください。これは、同じエラーを受けている人を助け場合

1

、私は同じエラーを取得し、溶液は私のために、以下のことになった:

交換:へ

databaseReference.child("somechild").setValue(etName.getText()); 

を:

databaseReference.child("somechild").setValue(etName.getText().toString()); 

@fraggjkeeが指摘するように、Firebaseシリアルしようとしこれは、.getText()の結果をシリアル化しようとしているfirebaseと同様の問題でした。

他人に役立つことを願っています!

関連する問題