9 votes

com.google.firebase.database.DatabaseException : Serializing Arrays n'est pas supporté, veuillez utiliser Lists à la place.

J'essaie de faire persister un objet personnalisé en utilisant le code suivant :

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

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

Voici mon objet :

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 
    // ...
}

Et à chaque fois, j'obtiens cette erreur - com.google.firebase.database.DatabaseException: Serializing Arrays is not supported, please use Lists instead . Mes objets ne contiennent pas de tableaux et cette erreur est donc assez déroutante. J'ai trouvé un moyen de corriger cette erreur - tout fonctionne bien si j'ajoute la balise @Exclude à l'annotation bodyParts liste de mon Exercise mais ce n'est évidemment pas ce que j'essaie de faire.

Il semble donc que Firebase soit incapable de faire persister les objets contenant des listes internes ? Existe-t-il des solutions de contournement simples ou des meilleures pratiques ? Merci !

P.S. J'utilise firebase-database:9.2.1

10voto

fraggjkee Points 150

J'ai réussi à trouver la cause de ce plantage. J'ai installé l'application sur un autre appareil fonctionnant sous Android 5.x et Firebase y a lancé une exception beaucoup moins déroutante :

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

Il est apparu que Firebase ( contrairement à Gson ) essaie de sérialiser tous les getters possibles même s'ils n'ont pas de lien direct avec les variables globales (membres de la classe / champs), dans mon cas particulier un de mes objets contenait une méthode renvoyant Drawable - getDrawable() . Manifestement, Firebase ne sait pas comment convertir un drawable en json.

Fait intéressant (probablement un bug dans le SDK Firebase) : sur mon ancien appareil fonctionnant sous Android 4.4.1, j'obtiens toujours l'exception d'origine avec le même projet et la même configuration :

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

3voto

Rbar Points 977

Au cas où cela aiderait d'autres personnes qui reçoivent la même erreur, je recevais la même erreur et la solution s'est avérée être la suivante pour moi :

Changer :

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

A :

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

Comme le souligne @fraggjkee, Firebase tente de sérialiser les getters, et c'était le même problème ici avec firebase qui tentait de sérialiser le résultat de la fonction .getText() .

J'espère que cela aidera d'autres personnes !

2voto

Drew Holtzapfel Points 26

Ajoutez @Exclude aux fonctions que FB tente d'interpréter, comme celles qui renvoient un Drawable.

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

1voto

Rene Enriquez Points 427

J'ai eu un problème similaire, j'essayais d'utiliser groovy au lieu de Java, je suppose que groovy génère d'autres méthodes get pour moi. J'ai converti ma classe de domaine de Pogo (src/main/groovy) à Pojo (src/main/java) et maintenant tout fonctionne bien.

1voto

Davis Kazad Points 11

//créer votre liste d'objets par le constructeur

private void handleData(){

    orderList = Db.getCarts();
    orders = new ArrayList<>();
    Double totalPrice = 0.0;

    for (Order order : orderList){
        // totalPrice = totalPrice + ( price * quantity )
        totalPrice += (Double.valueOf(order.getPrice())* Integer.valueOf(order.getQuantity()));
        orders.add(new Order(order.getProductId(),order.getProductName(),order.getQuantity(),order.getPrice(),order.getDiscount(),order.getImage()));
    }

}

private void alertDialog() {

    AlertDialog.Builder alert = new AlertDialog.Builder(getContext());
    alert.setTitle("One more step!");
    alert.setMessage("Enter your address");

    final EditText edtaddress = new EditText(getContext());
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.MATCH_PARENT
    );

    edtaddress.setLayoutParams(layoutParams);
    alert.setView(edtaddress);
    alert.setIcon(R.drawable.ic_shopping_cart_black_24dp);

    alert.setPositiveButton("YES", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Request request = new Request(
                    Common.currentUser.getPhone(),
                    Common.currentUser.getName(),
                    edtaddress.getText().toString(),
                    textTotal.getText().toString(),
                    orders
            );

            // Submit to firebase
            // We will using system.currentMillis to key
            requestReference.child(String.valueOf(System.currentTimeMillis()))
                    .setValue(request);
            //Delete cart
            Db.deleteCart();
            Toast.makeText(getContext(), "Thank you , Order Place", Toast.LENGTH_SHORT).show();
            getActivity().finish();
        }
    });

    alert.setNegativeButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });

    alert.show();

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X