Java FirebaseException:无法分析类位于NodeUtilities.NodeFromJSON中的节点

Java FirebaseException:无法分析类位于NodeUtilities.NodeFromJSON中的节点,java,firebase,Java,Firebase,我在Java中使用Firebase。当必须更新用户信息时,以下简单代码始终运行良好: final FirebaseBean_User userObject = new FirebaseBean_User(uuid, name, timestamp, points, gamesPlayed, gamesWon); mFirebaseUser.setValue(userObject, System.currentTimeMillis()); 我使用当前时间戳作为优先级值,这样我就可以得到最近在线的

我在Java中使用Firebase。当必须更新用户信息时,以下简单代码始终运行良好:

final FirebaseBean_User userObject = new FirebaseBean_User(uuid, name, timestamp, points, gamesPlayed, gamesWon);
mFirebaseUser.setValue(userObject, System.currentTimeMillis());
我使用当前时间戳作为优先级值,这样我就可以得到最近在线的所有用户的列表

但是,当用户脱机时,我希望将其标记为脱机。因此,我在中间又加了一行:

final FirebaseBean_User userObject = new FirebaseBean_User(uuid, name, timestamp, points, gamesPlayed, gamesWon);
mFirebaseUser.onDisconnect().setValue(userObject, USER_PRIORITY_OFFLINE); // best practice: always call onDisconnect() before the actual setValue() operation to prevent ghost data
mFirebaseUser.setValue(userObject, System.currentTimeMillis());
FATAL EXCEPTION: main
com.firebase.client.FirebaseException: Failed to parse node with class class com.my.package.MultiplayerService$FirebaseBean_User
    at com.firebase.client.snapshot.NodeUtilities.NodeFromJSON(NodeUtilities.java:130)
    at com.firebase.client.OnDisconnect.setValue(OnDisconnect.java:81)
    at com.my.package.MultiplayerService.updateUserInformation(MultiplayerService.java:465)
    at com.my.package.MultiplayerService.access$4(MultiplayerService.java:461)
    at com.my.package.MultiplayerService$1.onDataChange(MultiplayerService.java:83)
    at com.firebase.client.core.ValueListenerContainer$1.run(ValueListenerContainer.java:50)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4514)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
    at dalvik.system.NativeStart.main(Native Method)
突然,这段代码停止了工作。我得到了以下异常,其中导致该异常的行(465)是中间的新行:

final FirebaseBean_User userObject = new FirebaseBean_User(uuid, name, timestamp, points, gamesPlayed, gamesWon);
mFirebaseUser.onDisconnect().setValue(userObject, USER_PRIORITY_OFFLINE); // best practice: always call onDisconnect() before the actual setValue() operation to prevent ghost data
mFirebaseUser.setValue(userObject, System.currentTimeMillis());
FATAL EXCEPTION: main
com.firebase.client.FirebaseException: Failed to parse node with class class com.my.package.MultiplayerService$FirebaseBean_User
    at com.firebase.client.snapshot.NodeUtilities.NodeFromJSON(NodeUtilities.java:130)
    at com.firebase.client.OnDisconnect.setValue(OnDisconnect.java:81)
    at com.my.package.MultiplayerService.updateUserInformation(MultiplayerService.java:465)
    at com.my.package.MultiplayerService.access$4(MultiplayerService.java:461)
    at com.my.package.MultiplayerService$1.onDataChange(MultiplayerService.java:83)
    at com.firebase.client.core.ValueListenerContainer$1.run(ValueListenerContainer.java:50)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4514)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
    at dalvik.system.NativeStart.main(Native Method)
为什么会这样?我做错什么了吗?我的意思是,
setValue()
以前工作得很好,现在唯一的变化是我也调用了
onDisconnect()
,它停止了工作

(该参考点之前是否有数据并不重要。)

以下是用于参考的类:

private static class FirebaseBean_User {

    private String uuid;
    private String name;
    private int lastlogin;
    private double points;
    private int gamesplayed;
    private int gameswon;

    private FirebaseBean_User() { }

    public FirebaseBean_User(String uuid, String name, int lastlogin, double points, int gamesplayed, int gameswon) {
        this.uuid = uuid;
        this.name = name;
        this.lastlogin = lastlogin;
        this.points = points;
        this.gamesplayed = gamesplayed;
        this.gameswon = gameswon;
    }

    public String getUuid() {
        return uuid;
    }

    public String getName() {
        return name;
    }

    public int getLastlogin() {
        return lastlogin;
    }

    public double getPoints() {
        return points;
    }

    public int getGamesplayed() {
        return gamesplayed;
    }

    public int getGameswon() {
        return gameswon;
    }

    @Override
    public boolean equals(Object o) {
        return (o instanceof FirebaseBean_User && ((FirebaseBean_User) o).getUuid() == this.uuid);
    }

}

在com.firebase.client.snapshot.NodeUtilities类中,这似乎是一个JSON解析问题

我没有在这个类上找到任何文档,但是根据我与其他序列化/解析引擎的经验,我怀疑问题在于
FirebaseBean\u User
类,因为缺少空的可访问(如公共)构造函数

大多数解析引擎最终都会调用
Class.newInstance()
方法,该方法实例化调用空构造函数的对象

因此,尝试改变:

private FirebaseBean_User() { }
用于:


这实际上是Firebase SDK中的一个bug,对此表示抱歉!具体来说,这是OnDisconnect处理程序中的一个问题。这就是为什么它适用于ref.setValue,但不适用于ref.onDisconnect().setValue。我会尽快找到解决方案,并在答案可用时更新答案

编辑:尝试从中获取最新的SDK
它应该是1.0.4版。如果您继续遇到问题,请告诉我。

onDisconnect似乎无法将对象FirebaseBean_User(userObject)解析为JSON字符串或从JSON字符串解析。是的,抛出(JSON)的
异常可以明显看出这一点,但问题是为什么会这样。如您所见,
onDisconnect().setValue()
setValue()
正在将相同的对象写入引用节点,但是使用
setValue()
它可以工作,而使用
onDisconnect().setValue()
(之前只有一行)它不工作。为什么?离线时用户优先级的价值是什么?我猜引擎无法将其解析为有效的JSON。@Anant:这是一个值为
integer.MAX\u value
的整型常量,有什么问题吗?是的,看起来不错,应该可以工作。我会让我们的开发团队调查一下,谢谢!谢谢,但这不会改变任何事情。我现在已经将类
FirebaseBean\u User
设置为一个单独的类(不再嵌套),并将所有构造函数、方法和字段设置为公共的-没有任何更改。此外,私有默认构造函数正是Firebase建议的方法,请参见此处的第一个代码示例(Java):OK。很抱歉没有提供帮助。没问题:)您的建议似乎非常合理,因为似乎没有任何效果,我猜这是Firebase SDK中的一个错误。仍然面临相同的问题,异常是:
com.Firebase.client.FirebaseException:未能解析类为MY_class_NAME的节点
,我正在尝试另存为:
ref.child(“users”).child(encodeEmail(mEmail)).setValue(encodeEmail(mEmail),user);
,请注意,我是在Firebase上创建项目后第一次这样做的。@ShajeelAfzal我在setValue(..,..)方法中面临同样的问题。你能解决吗?