2010-02-22 6 views
11

ich die folgenden Java-Modellklasse in AppEngine habe:Leere Liste in appengine Datenspeichern: java vs Python

public class Xyz ... { 
    @Persistent 
    private Set<Long> uvw; 
} 

Beim Speichern eines Objekts Xyz mit einem leeruvw in Java gesetzt, bekomme ich ein "null" Feld (wie in der Appengine Datastore Viewer aufgelistet). Wenn ich versuche, das gleiche Objekt in Python (durch remote_api) zu laden, wie durch die folgende Python-Modellklasse definiert:

class Xyz(db.Model): 
    uvw = db.ListProperty(int) 

ich eine „BadValueError: Immobilien uvw erforderlich ist“.

Wenn mit einer leeren uvw Liste ein anderes Objekt der gleichen Klasse in Python zu speichern, druckt der Datenspeicher-Viewer eine „ fehlt“ ein.

Offenbar leere Listen Speicherbehandlung unterscheidet zwischen Java und Python und führen zu "inkompatiblen" Objekten.

So meine Frage: Gibt es eine Möglichkeit, entweder:

  • Kraft Java eine leere Liste als „fehlend“ Feld zu speichern,
  • Kraft Python, um eine „Null“ -Liste anmutig zu akzeptieren, wie eine leere Liste beim Laden des Objekts?

Oder irgendein anderer Vorschlag, wie man leeres Listenfeld in beiden Sprachen handhabt.

Vielen Dank für Ihre Antworten!

Antwort

2

Es sollte funktionieren, wenn Sie einen Standardwert für Ihre Python-Eigenschaft zuweisen:

uvw = db.ListProperty(int, default=[]) 
0

Das Java-Set-Verhalten ist darauf zurückzuführen, dass die Collections von Java Referenztypen sind, die standardmäßig null sind.

@Persistent 
private Set<Long> uvw = new HashSet<Long>(); 

oder unter Verwendung eines andere Implementierung von Set auf der rechten Seite:

Um tatsächlich ein leeres Set, erklärt es so zu schaffen. HashSet ist jedoch der am häufigsten verwendete Set-Typ. Weitere interessante Settypen sind die beiden thread-sicheren Sets CopyOnWriteArraySet und ConcurrentSkipListSet; auch das geordnete Set vom Typ LinkedHashSet und das sortierte Set vom Typ TreeSet.

+1

Danke, aber wenn ich das Objekt auf den Datenspeicher speichern die Menge ist * leer * nicht * null * (mein Code nicht klar, ich hätte angeben sollen, dass vor dem Speichern des Objekts das Set ein leeres HashSet ist). Der Trick hier ist, dass der Appengine-Datenspeicher-Layer beim Speichern die leere Menge in "Null" -Werte konvertiert, und ich sehe keine Kontrolle über dieses Verhalten. –

+0

@IOranger: Ah, OK. Ich würde diese Antwort löschen, aber ich werde es hier lassen, damit jemand anderes später nicht kommt und dasselbe sagt. – Powerlord

1

Ich benutze die Low-Level-Java-API, also vielleicht was ich tue, wäre anders. Bevor ich jedoch eine Datenstruktur vom Sammlungs-Typ in den Datenspeicher speichere, wandle ich sie in etwas um, das der Datenspeicher natürlich verarbeitet. Dies würde hauptsächlich Strings und ByteArrays beinhalten.

Es klingt wie Java App Engine interpretiert die leere Menge als Nullwert. Und Python liest diesen Nullwert nicht korrekt. Sie könnten versuchen, eine leere Menge als String-Wert "leerer Satz" zu speichern. Und dann python überprüfen, ob der Datenspeicher diesen Zeichenfolgenwert enthält. Wenn dies der Fall ist, könnte es eine neue leere Menge zuweisen, andernfalls könnte es die Eigenschaft als eine Menge lesen.