2010-02-22 9 views
11

Tengo el siguiente modelo de clase Java en App Engine:lista vacía en el almacén de datos de Google App Engine: java vs pitón

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

Al guardar un objeto Xyz con un vacío establece UVW en Java, lo entiendo un campo "null" (como se detalla en el visor de datos del appengine). Cuando intento cargar el mismo objeto en Python (a través de remote_api), como se define por la siguiente clase de modelo de pitón:

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

me sale un "BadValueError: UVW propiedad se requiere".

Al guardar otro objeto de la misma clase en Python con una lista vacía UVW, el espectador almacén de datos imprimir un campo "falta".

Aparentemente el manejo de almacenamiento de listas vacías difiere entre Java y Python y conduce a objetos "incompatibles".

Por lo tanto mi pregunta: ¿Hay una manera de, ya sea:

  • fuerza de Java para almacenar una lista vacía como un campo "perdido",
  • fuerza de Python para aceptar con gracia una lista "nulo", como una lista vacía al cargar el objeto?

O cualquier otra sugerencia sobre cómo manejar el campo de la lista vacía en ambos idiomas.

Gracias por sus respuestas!

Respuesta

2

Debería funcionar si asigna un valor por defecto a su propiedad Python:

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

El comportamiento del conjunto de Java se debe a que las colecciones de Java son tipos de referencia, que por defecto son nulas.

para realmente crear un conjunto vacío, declarar así:

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

o usar alguna otra aplicación de Set en el lado derecho. HashSet es el tipo de conjunto más utilizado, sin embargo. Otros tipos de conjuntos interesantes son los conjuntos de dos subprocesos CopyOnWriteArraySet y ConcurrentSkipListSet; también el conjunto ordenado tipo LinkedHashSet y el conjunto ordenado tipo TreeSet.

+1

Gracias, pero al guardar el objeto al almacén de datos del conjunto es * vacío *, no * * nula (mi código es no está claro, debería haber especificado que antes de almacenar el objeto el conjunto es un HashSet vacío). El truco aquí es que la capa de almacén de datos appengine parece convertir el conjunto vacío a valores "nulos" cuando se almacena, y no veo ningún control sobre este comportamiento. –

+0

@ ORranger: Ah, vale. Iba a eliminar esta respuesta, pero la dejaré aquí para que alguien más no venga más tarde y diga lo mismo. – Powerlord

1

Uso la API de bajo nivel, así que quizás lo que estoy haciendo sea diferente. Pero antes de guardar una estructura de datos de tipo colección en el almacén de datos, la convierto en algo que el almacén de datos maneja de forma natural. Esto incluiría principalmente Strings y ByteArrays.

Parece que el motor de aplicaciones Java está interpretando el conjunto vacío como un valor nulo. Y Python no está leyendo este valor nulo correctamente. Puede tratar de guardar un conjunto vacío como el valor de cadena "conjunto vacío". Y luego haga una comprobación de Python para ver si el almacén de datos contiene ese valor de cadena. Si lo hace, podría asignar un nuevo conjunto vacío, si no, podría leer la propiedad como un conjunto.

Cuestiones relacionadas