Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Firebase序列化问题[更新]_Java_Android_Firebase_Serialization_Firebase Realtime Database - Fatal编程技术网

Java Firebase序列化问题[更新]

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

我昨晚问了这个问题,但我认为我没有提供足够的信息,所以我将尝试更加彻底

我正在尝试这样做,当用户注册我的应用程序时,他们的数据以及一些其他变量将保存在Firebase实时数据库中。当帐户尝试注册时,我继续收到序列化错误

在com.google.firebase.database.obfuscated.zza$3类中找不到要序列化的属性

我已经尝试了无数的方法来修正这个错误,但似乎没有任何东西真正能够修正它,或者在修正它方面取得任何进展。这是我目前使用的注册方法

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