Java Firebase序列化问题[更新]
我昨晚问了这个问题,但我认为我没有提供足够的信息,所以我将尝试更加彻底 我正在尝试这样做,当用户注册我的应用程序时,他们的数据以及一些其他变量将保存在Firebase实时数据库中。当帐户尝试注册时,我继续收到序列化错误 在com.google.firebase.database.obfuscated.zza$3类中找不到要序列化的属性 我已经尝试了无数的方法来修正这个错误,但似乎没有任何东西真正能够修正它,或者在修正它方面取得任何进展。这是我目前使用的注册方法Java Firebase序列化问题[更新],java,android,firebase,serialization,firebase-realtime-database,Java,Android,Firebase,Serialization,Firebase Realtime Database,我昨晚问了这个问题,但我认为我没有提供足够的信息,所以我将尝试更加彻底 我正在尝试这样做,当用户注册我的应用程序时,他们的数据以及一些其他变量将保存在Firebase实时数据库中。当帐户尝试注册时,我继续收到序列化错误 在com.google.firebase.database.obfuscated.zza$3类中找不到要序列化的属性 我已经尝试了无数的方法来修正这个错误,但似乎没有任何东西真正能够修正它,或者在修正它方面取得任何进展。这是我目前使用的注册方法 firebaseAu
firebaseAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//start profile activity here
User users = new User(username, email, wins, losses, balance);
FirebaseDatabase.getInstance().getReference("Users")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.setValue(users)
.addOnCompleteListener
(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Toast.makeText(RegisterActivity.this, "Registration successful.", Toast.LENGTH_SHORT).show();
startActivity(new Intent(RegisterActivity.this, HomePage.class ));
} else {
Toast.makeText(RegisterActivity.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
progressDialog.hide();
}
}
});
} else {
Toast.makeText(RegisterActivity.this, "Registration not successful, please try again.", Toast.LENGTH_SHORT).show();
progressDialog.hide();
}
}
});
我已经确保我的所有变量都是公共的,并且我还为每件事添加了getter和setter(我不知道是否有必要)
我的用户类如下所示
public User(String userName, String email, int wins, int losses, double balance) {
this.userName = userName;
this.email = email;
this.wins = wins;
this.losses = losses;
this.balance = balance;
}
我还启用了proguard,并添加了规则,以保留我的User类和RegisterActivity类。这些是我加入的规则
-keepattributes Signature
-keepclassmembers com.example.brent.fifty_fifty.** {
*;
}
-keep class com.example.brent.fifty_fifty.RegisterActivity
-keep class com.example.brent.fifty_fifty.User
-keep class * {
public private *;
}
我不确定我的规则是否正确,或者我是否有一些不必要的规则,但这都是一个学习过程,因此,如果有任何错误,请告诉我,或者您对如何修复错误有建议
很抱歉这么频繁地发帖
我的User.class
package com.example.brent.fifty_fifty;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class User {
public String userName, email, specUserName;
public int wins, losses;
public double balance;
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String uid = user.getUid();
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("Users/"+uid);
public User() {
}
public User(String userName, String email, int wins, int losses, double balance) {
this.userName = userName;
this.email = email;
this.wins = wins;
this.losses = losses;
this.balance = balance;
}
public interface MyCallback{
void onSuccess(String userName);
}
public void getUserName(final MyCallback myCallback) {
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
specUserName = dataSnapshot.child("userName").getValue(String.class);
myCallback.onSuccess(specUserName);
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getWins() {
return wins;
}
public void setWins(int wins) {
this.wins = wins;
}
public int getLosses() {
return losses;
}
public void setLosses(int losses) {
this.losses = losses;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}发生这种情况是因为您在
用户
类中添加了余额
对象,该对象的类型为大十进制
。与有关的官方文档一样,BigDecimal
不是受支持的数据类型。要解决这个问题,您应该将balance
对象的te类型更改为受支持的数据类型。我建议你把它改成双倍的我把天平改成了双倍的,我甚至试着把天平都去掉。但错误仍然存在。还有其他建议吗?我在原来的帖子里更新了所有的课程。你想看整个班级吗?比如定义了balance double的用户类或者什么?请共享您的整个用户类。只需将其添加到底部:)我知道了。用户类不得定义不受支持的任何其他类型的字段。作为一个模型类,您应该只定义数据库中需要的字段,例如:用户名
,电子邮件
,赢
,亏
和余额
,构造函数,getter和setter(如果需要)。任何其他代码都应该移动到另一个类,比如说UtilsClass
或HelperClass
。因此,您应该删除与用户
、数据库
和myRef
对象(声明、方法等)相关的所有内容。
package com.example.brent.fifty_fifty;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class User {
public String userName, email, specUserName;
public int wins, losses;
public double balance;
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String uid = user.getUid();
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("Users/"+uid);
public User() {
}
public User(String userName, String email, int wins, int losses, double balance) {
this.userName = userName;
this.email = email;
this.wins = wins;
this.losses = losses;
this.balance = balance;
}
public interface MyCallback{
void onSuccess(String userName);
}
public void getUserName(final MyCallback myCallback) {
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
specUserName = dataSnapshot.child("userName").getValue(String.class);
myCallback.onSuccess(specUserName);
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getWins() {
return wins;
}
public void setWins(int wins) {
this.wins = wins;
}
public int getLosses() {
return losses;
}
public void setLosses(int losses) {
this.losses = losses;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}