Пустой список в хранилище данных appengine: Java против Python - PullRequest
11 голосов
/ 22 февраля 2010

У меня есть следующий класс Java-модели в AppEngine:

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

При сохранении объекта Xyz с пустым набором uvw в Java, я получаю поле " null " (как указано в списке в приложении просмотра данных Appengine). Когда я пытаюсь загрузить тот же объект в Python (через remote_api), как определено в следующем классе модели Python:

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

Я получаю " BadValueError: Требуется свойство uvw ".

При сохранении другого объекта того же класса в python с пустым списком uvw программа просмотра хранилища данных печатает поле « отсутствует ».

Видимо обработка хранилища пустых списков отличается в Java и python и приводит к "несовместимым" объектам.

Таким образом, мой вопрос: есть ли способ, либо:

  • заставить Java хранить пустой список как «пропущенное» поле,
  • заставить Python изящно принять «нулевой» список как пустой список при загрузке объекта?

Или любое другое предложение о том, как обрабатывать пустое поле списка на обоих языках.

Спасибо за ваши ответы!

Ответы [ 4 ]

2 голосов
/ 20 июня 2010

Это должно работать, если вы назначите значение по умолчанию для вашего свойства Python:

uvw = db.ListProperty(int, default=[])
1 голос
/ 16 июня 2010

Я использую Java-API низкого уровня, поэтому, возможно, то, что я делаю, будет другим. Но прежде чем сохранить структуру данных типа коллекции в хранилище данных, я преобразовываю ее во что-то, что хранилище данных естественно обрабатывает. Это будет в основном Strings и ByteArrays.

Похоже, что Java-движок приложения интерпретирует пустой набор как нулевое значение. И python неправильно читает это нулевое значение. Вы можете попытаться сохранить пустой набор как строковое значение «пустой набор». И затем проверьте python, чтобы увидеть, содержит ли хранилище данных это строковое значение. Если это так, он может выделить новый пустой набор, если нет - он может прочитать свойство как набор.

0 голосов
/ 15 июля 2018

Это может работать для вас

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

Это самый комментирующий способ закорочения ...

0 голосов
/ 22 февраля 2010

Поведение Java Set связано с тем, что коллекции Java являются ссылочными типами, по умолчанию равными нулю.

Чтобы создать пустой набор, объявите его следующим образом:

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

или с использованием другой реализации Set на правой стороне. HashSet, тем не менее, является наиболее часто используемым типом набора. Другими интересными типами наборов являются два поточно-безопасных набора CopyOnWriteArraySet и ConcurrentSkipListSet; также тип Упорядоченного набора LinkedHashSet и тип Сортированного набора TreeSet.

...