2013-08-23 10 views
6

Ich verwende Firebase in Java. Der folgende einfache Code hat immer gut funktioniert, wenn der Benutzer Informationen aktualisiert werden mußten:FirebaseException: Fehler beim Analysieren des Knotens mit Klasse in NodeUtilities.NodeFromJSON

final FirebaseBean_User userObject = new FirebaseBean_User(uuid, name, timestamp, points, gamesPlayed, gamesWon); 
mFirebaseUser.setValue(userObject, System.currentTimeMillis()); 

ich verwenden, um den aktuellen Zeitstempel als den Wert Priorität, so dass ich eine Liste aller Benutzer erhalten kann, die vor kurzem online waren.

Wenn Benutzer jedoch offline gehen, möchte ich sie als offline markieren. Also fügte ich noch eine einfache Zeile in der Mitte hinzu:

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()); 

Und plötzlich hörte dieses Stück Code auf zu arbeiten. Ich erhalte die folgende Ausnahme, wo die Verursachung Linie (465) die neuen in der Mitte ist:

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) 

Warum das passiert? Mache ich etwas falsch? Ich meine, setValue() hat vorher gut funktioniert, jetzt ist die einzige Änderung, dass ich es auf onDisconnect() auch nenne und es funktioniert nicht mehr.

(Es spielt keine Rolle, ob es Daten wurden an diesem Referenzpunkt vor oder nicht.)

Hier ist die Klasse, die als Referenz verwendet wird:

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

} 
+0

Es scheint, dass onDisconnect das Objekt FirebaseBean_User (userObject) nicht in oder aus einer JSON-Zeichenfolge analysieren kann. –

+0

Ja, das wird offensichtlich durch die 'Exception', die geworfen wird (_into_ JSON), aber die Frage ist _why_ genau das ist so. Wie Sie sehen können, schreiben 'onDisconnect(). SetValue()' und 'setValue()' dasselbe Objekt in den Referenzknoten, aber mit 'setValue()' funktioniert es und mit 'onDisconnect(). SetValue() '(nur 1 Zeile vorher), es funktioniert nicht. Warum? – caw

+0

Was ist der Wert von USER_PRIORITY_OFFLINE? Ich schätze, die Engine ist nicht in der Lage, das in gültiges JSON zu analysieren. – Anant

Antwort

0

Es scheint ein JSON Parsen Probleme , in der Klasse com.firebase.client.snapshot.NodeUtilities.

Ich habe kein Dokument über diese Klasse gefunden, aber aufgrund meiner Erfahrung mit anderen Serialisierungs-/Parsing-Engines vermute ich, dass das Problem auf Ihrer FirebaseBean_User-Klasse liegt, da kein (wie in der Öffentlichkeit zugänglicher) Konstruktor zur Verfügung steht .

Die meisten Parsing-Engines rufen schließlich die Methode Class<?>.newInstance() auf, die das Objekt instanziiert, das den leeren Konstruktor aufruft.

Also, versuchen zu ändern:

private FirebaseBean_User() { } 

für:

public FirebaseBean_User() { } 
+0

Danke, aber das ändert nichts _anything_. Ich habe nun die Klasse 'FirebaseBean_User' zu einer separaten Klasse gemacht (nicht mehr verschachtelt) und alle Konstruktoren, Methoden und Felder veröffentlicht - keine Änderung. Außerdem war der private Standardkonstruktor genau so, wie Firebase es vorschlägt, siehe das erste Codebeispiel (Java) hier: https://www.firebase.com/docs/managing-lists.html – caw

+0

OK. Tut mir leid, dass ich nicht geholfen habe. –

+1

Kein Problem :) Ihr Vorschlag schien völlig in Ordnung, und weil nichts zu funktionieren scheint, ist es ein Fehler im Firebase SDK. – caw

2

Dies ist in der Tat ein Fehler in der Firebase SDK, traurig über das! Insbesondere ist dies ein Problem im OnDisconnect-Handler. Deshalb funktioniert es für ref.setValue, aber nicht ref.onDisconnect(). SetValue. Ich werde so schnell wie möglich einen Fehler beheben und meine Antwort aktualisieren, sobald sie verfügbar ist.

Edit: versuchen, das neueste SDK von https://www.firebase.com/docs/downloads.html Es sollte Version 1.0.4 sein. Lassen Sie es mich wissen, wenn Sie weiterhin Probleme haben.

+0

Immer noch mit dem gleichen Problem, Ausnahme ist: 'com.firebase.client.FirebaseException: Parsen Knoten mit Klasse Klasse MY_CLASS_NAME fehlgeschlagen, ich versuche zu speichern als:' ref.child ("Benutzer"). Kind (encodeEmail (mEmail)). setValue (encodeEmail (mEmail), user); ', bitte beachte, dass ich dies zum ersten Mal mache, nachdem ich das Projekt auf Firebase erstellt habe. –

+0

@ShajeelAfzal Ich habe das gleiche Problem mit der Methode setValue (.., ..). Könnten Sie es lösen? –

Verwandte Themen