Пустой список в хранилище данных App Engine: Java против Python

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

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: Property uvw требуется".

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

Похоже, что механизм java-приложений интерпретирует пустой набор как нулевое значение. И python неправильно считывает это значение. Вы можете попытаться сохранить пустой набор как значение String "empty set". Затем попробуйте проверить python, чтобы убедиться, что хранилище данных хранит это строковое значение. Если это так, он может выделить новый пустой набор, если нет, он может прочитать свойство как набор.

Ответ 3

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

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

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

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

Ответ 4

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

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

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