Firebase实时数据库存数据报错:无StringBuilder可序列化属性
Firebase实时数据库保存数据报错:No properties to serialize found on class java.lang.StringBuilder
报错信息
com.google.firebase.database.DatabaseException: No properties to serialize found on class java.lang.StringBuilder at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.<init>(CustomClassMapper.java:548) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.loadOrCreateBeanMapperForClass(CustomClassMapper.java:330) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.serialize(CustomClassMapper.java:167) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.serialize(CustomClassMapper.java:142) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToPlainJavaTypes(CustomClassMapper.java:61) at com.google.firebase.database.DatabaseReference.setValueInternal(DatabaseReference.java:282) at com.google.firebase.database.DatabaseReference.setValue(DatabaseReference.java:159)
此前项目使用相同代码无问题,现在却出现该错误。以下是用于保存数据的函数代码:
private fun saveDetails() { val userDataRef: DatabaseReference = FirebaseDatabase.getInstance().reference.child("UsersData").child(currentUserId) val userMap = HashMap<String, Any>() userMap["name"] = name userMap["email"] = email userMap["imageUrl"] = profileImageUrl userMap["phoneNumber"] = number userDataRef.setValue(userMap).addOnCompleteListener { task -> if (task.isSuccessful) { Toast.makeText( baseContext, "$name has successfully registered with email id $email.", Toast.LENGTH_SHORT ).show() startActivity(Intent(this, MainActivity::class.java)) } else { Toast.makeText(baseContext, task.result.toString(), Toast.LENGTH_SHORT).show() Log.e("Task Unsuccessful", task.result.toString()) } } }
问题原因与解决方案
问题根源:Firebase实时数据库的序列化器无法处理
StringBuilder类型的数据。你存入userMap的name、email、profileImageUrl或number中,至少有一个变量实际是StringBuilder类型而非String,导致序列化失败。修复方法:将所有存入
userMap的字符串类变量转换为String类型:
直接对变量调用.toString()方法,修改后的代码如下:val userMap = HashMap<String, Any>() userMap["name"] = name.toString() userMap["email"] = email.toString() userMap["imageUrl"] = profileImageUrl.toString() userMap["phoneNumber"] = number.toString()同时检查变量的初始化和赋值逻辑,确保后续操作中这些变量直接使用
String类型,避免意外创建StringBuilder实例。额外排查建议:
- 确认
currentUserId是有效的String类型,避免传入非字符串类型引发连锁问题。 - 若近期升级过Firebase依赖,可能是序列化逻辑的兼容性变化,此时需确保所有待序列化数据都是标准可序列化类型(如String、Int、Boolean、Map、自定义数据类等)。
- 确认
内容的提问来源于stack exchange,提问作者Prasad B
相关产品推荐
相关产品推荐

