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); 

这是我的目标:

 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 bodyParts; public Exercise() {} // getters, setters, other methods // ... } public class BodyPart { private String id; private String name; public BodyPart() {} // getters, setters, other methods // ... } 

每次我收到此错误时 – com.google.firebase.database.DatabaseException: Serializing Arrays is not supported, please use Lists instead 。 我的对象不包含任何数组,因此这个错误看起来很混乱。 我find了一种方法来修复这个错误 – 如果我将@Exclude注释添加到我的Exercise类的bodyParts列表中,一切正常,但显然不是我想要实现的。

所以似乎Firebase无法持久存储包含内部列表的对象? 这里有任何简单的解决方法或最佳实践吗? 谢谢!

PS我正在使用firebase-database:9.2.1

我已经设法find造成这次崩溃的原因。 我在另一台运行Android 5.x的设备上安装了该应用,Firebase在那里引发了一个不那么混乱的exception:

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

似乎Firebase( 与Gson不同 )尝试序列化所有可能的getter,即使它们没有与全局variables(类成员/字段)直接连接,在我的特定情况下,我的一个对象包含一个返回Drawable的方法 – getDrawable() 。 显然,Firebase不知道如何将drawable转换为json。

有趣的时刻(可能是Firebase SDK中的一个错误):在运行Android 4.4.1的旧设备上,我仍然在同一个项目和配置中得到我的原始exception:

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

将@Exclude添加到FB尝试解释的函数,例如返回Drawable的函数。

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

如果这有助于其他人收到相同的错误,我得到了同样的错误,解决方案最终成为我的以下内容:

更改:

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

至:

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

正如@fraggjkee指出的那样,Firebase尝试序列化getter,这就是.getText()试图序列化.getText()结果的类似问题。

希望这有助于他人!

我有一个类似的问题,我试图使用groovy而不是Java,我想groovy正在为我生成其他get方法。 我将我的域类从Pogo(src / main / groovy)转换为Pojo(src / main / java),现在一切运行良好

将@IgnoreExtraProperties添加到您的class级

 @IgnoreExtraProperties public class YourPojo { public String name; // Default constructor for Firebase public YourPojo(){} // Normal constructor public YourPojo(String name) { this.name = name; } } 

以下是我如何解决这个问题的方法。 当我尝试更新数据库中的int字段时,会出现此问题。 我从编辑文本字段获取文本并忘记将其转换为int。 这导致了失败。 因此,如果出现此问题,请尝试检查您要发送到数据库的数据types。