Проблемы сериализации Firebase [ОБНОВЛЕНО] - PullRequest
0 голосов
/ 20 октября 2018

Я задал этот вопрос вчера вечером, но не думаю, что предложил достаточно информации, поэтому я постараюсь быть более тщательным!

Я пытаюсь сделать так, чтобы, когда пользовательрегистры для моего приложения, их данные вместе с некоторыми другими переменными будут сохранены в базе данных Firebase Realtime.Я продолжаю получать ошибку сериализации, когда учетная запись пытается зарегистрироваться.

Не найдено свойств для сериализации в классе 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)

Я убедился, что все мои переменные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;
}

И у меня также естьproguard включен, и я добавил правила, чтобы сохранить класс пользователя и класс 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;
}

}

1 Ответ

0 голосов
/ 20 октября 2018

Это происходит потому, что вы добавили в свой класс User объект balance, который имеет тип BigDecimal.Как и в официальной документации, касающейся типов данных в реальном времени Firebase , BigDecimal не является поддерживаемым типом данных.Чтобы решить эту проблему, вы должны изменить тип вашего объекта balance на поддерживаемый тип данных.Я рекомендую вам изменить его на Double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...