【问题标题】:Firebase Serialization Issues [UPDATED]Firebase 序列化问题 [更新]
【发布时间】:2018-10-19 23:19:57
【问题描述】:

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

我正在努力做到这一点,以便当用户注册我的应用程序时,他们的数据以及其他一些变量将保存在 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();
            }
        }
    });

特别是在这部分代码上调用了错误

.setValue(users)

我已经确保我的所有变量都是公开的,并且我还为所有内容添加了 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 *;
}

我不确定我的规则是否正确,或者其中是否有一些不必要的规则,但这都是一个学习过程,所以如果有任何问题或您对如何解决问题有任何建议,请告诉我错误!

抱歉这么频繁发帖

我的用户.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;
}

}

【问题讨论】:

    标签: java android firebase serialization firebase-realtime-database


    【解决方案1】:

    发生这种情况是因为您在 User 类中添加了 balance 类型为 BigDecimal 的对象。正如在有关Firebase realtime databse data tyes 的官方文档中一样,BigDecimal 不是受支持的数据类型。要解决此问题,您应该将 balance 对象的 te 类型更改为支持的数据类型。我建议您将其更改为Double

    【讨论】:

    • 我把平衡改成双倍型,我什至试着把平衡全部去掉。但是错误仍然出现。还有其他建议吗?
    • 我更新了原帖中的所有课程。你想看整个班级吗?像定义了 balance double 的 User 类还是什么?
    • 请分享您的整个 User 类。
    • 刚刚添加到底部了:)
    • 我现在明白了。您的 User 类必须定义不受支持的任何其他类型的字段。作为模型类,您应该定义数据库中需要的字段,例如:userNameemailwinslossesbalance,构造函数, getter 和 setter(如果需要)。任何其他代码都应该移到另一个类,比如UtilsClassHelperClass。因此,您应该删除与userdatabasemyRef 对象(声明、方法等)相关的所有内容。
    猜你喜欢
    • 2022-10-24
    • 2021-02-17
    • 2017-09-11
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多