web-dev-qa-db-fra.com

com.google.firebase.database.DatabaseException: la sérialisation des tableaux n'est pas prise en charge. Veuillez utiliser plutôt les listes.

J'essaie de conserver un objet personnalisé à l'aide du 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 que je reçois cette erreur - com.google.firebase.database.DatabaseException: Serializing Arrays is not supported, please use Lists instead. Mes objets ne contiennent aucun tableau, cette erreur est donc source de confusion. J'ai trouvé un moyen de corriger cette erreur - tout fonctionne correctement si j'ajoute l'annotation @Exclude à la liste bodyParts de ma classe Exercise mais ce n'est évidemment pas ce que j'essaie d'atteindre. 

Il semble donc que Firebase est incapable de conserver des objets contenant des listes internes? Existe-t-il des solutions simples ou des meilleures pratiques ici? Merci! 

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

10
fraggjkee

J'ai réussi à trouver la raison de cet accident. J'ai installé l'application sur un autre appareil sous Android 5.x et Firebase 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 ) essayait de sérialiser tous les accesseurs possibles même s’ils n’avaient 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 retournant Drawable - getDrawable(). Evidemment, Firebase ne sait pas convertir convertible en json.

Moment intéressant (probablement un bogue dans le SDK Firebase): sur mon ancien appareil fonctionnant sous Android 4.4.1, j'ai toujours mon exception d'origine dans 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
11
fraggjkee

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

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

Au cas où cela aiderait les autres destinataires de la même erreur, la même erreur se présentait et la solution a été la suivante:

En changeant:

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

À:

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

Comme @fraggjkee le fait remarquer, Firebase tente de sérialiser les getters. Il s’agit du même problème avec Firebase qui tente de sérialiser le résultat de .getText().

J'espère que cela aide les autres!

3
Rbar

// recréez 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()));
    }

}

privé 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();

}
1
Davis Kazad

J'ai eu un problème similaire, j'essayais d'utiliser groovy à la place 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

1
Rene Enriquez

Voici comment cela a été résolu pour moi. Le problème est survenu lorsque j'ai tenté de mettre à jour un champ int dans la base de données. Je recevais du texte du champ de texte d'édition et j'ai oublié de le convertir en int. Cela a causé l'échec. Essayez donc de vérifier le type de données que vous envoyez à la base de données si ce problème se produit.

0
Vijay

Ajoutez @IgnoreExtraProperties à votre classe

@IgnoreExtraProperties
public class YourPojo {
    public String name;

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

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