Firebase实时数据库添加数据时遇“No properties to serialize found on class”错误
解决Firebase实时数据库序列化问题:字段首字母大写+No properties错误
嘿,我一眼就发现你代码里的问题啦!你遇到的两个问题——@PropertyName不生效和“No properties to serialize found on class”错误,根源都是同一个:你给每个字段的get和set方法都加了@Exclude注解。
错误原因解析
@get:Exclude和@set:Exclude的作用是告诉Firebase的序列化器忽略这个属性的读取和写入操作,相当于把这些字段完全从序列化流程中排除了。你把所有字段都加了这个注解,Firebase自然找不到任何可以序列化的属性,就会抛出“No properties to serialize found on class”错误;同时@PropertyName也因为属性被排除,完全没机会发挥作用。
正确的实现方式
如果你想让字段在Firebase数据库中以首字母大写的形式存储,只需要保留@PropertyName注解,去掉那些不必要的@get:Exclude和@set:Exclude就行。这里给你两种可行的写法:
写法一:直接标注字段(最简洁)
import com.google.firebase.database.PropertyName class User( @PropertyName("FirstName") var firstName: String = "", @PropertyName("LastName") var lastName: String = "", @PropertyName("Email") var email: String = "" // 其他需要存储的字段同理 )
写法二:配合自定义Getter/Setter(如果需要额外逻辑)
如果你需要对字段的读写加额外逻辑,也可以把@PropertyName标注在Getter或Setter上,同时确保不要加@Exclude:
import com.google.firebase.database.PropertyName class User { private var _firstName: String = "" @PropertyName("FirstName") fun getFirstName(): String { return _firstName } @PropertyName("FirstName") fun setFirstName(value: String) { _firstName = value } // lastName和email同理 }
额外提醒
如果你的类里有不需要存储到数据库的临时字段,再给那个字段的get或set加@Exclude,比如:
class User( @PropertyName("FirstName") var firstName: String = "", // 这个临时字段不需要存到数据库 @get:Exclude var tempToken: String = "" )
这样修改后,Firebase就能正确识别你的属性,并且按照@PropertyName指定的首字母大写字段名存储数据啦!
内容的提问来源于stack exchange,提问作者secondubly
相关产品推荐
相关产品推荐

