Ответ 1
Он должен работать, если вы присвоите значение по умолчанию вашему свойству Python:
uvw = db.ListProperty(int, default=[])
У меня есть следующий класс 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 и приводит к "несовместимым" объектам.
Таким образом, мой вопрос: есть ли способ, либо:
Или любое другое предложение о том, как обрабатывать пустое поле списка на обоих языках.
Спасибо за ваши ответы!
Он должен работать, если вы присвоите значение по умолчанию вашему свойству Python:
uvw = db.ListProperty(int, default=[])
Я использую низкоуровневую java-api, поэтому, возможно, то, что я делаю, будет другим. Но прежде чем я сохраню структуру данных типа коллекции в хранилище данных, я преобразую ее во что-то, что естественно обрабатывает хранилище данных. Это будет включать в основном строки и байтовые массивы.
Похоже, что механизм java-приложений интерпретирует пустой набор как нулевое значение. И python неправильно считывает это значение. Вы можете попытаться сохранить пустой набор как значение String "empty set". Затем попробуйте проверить python, чтобы убедиться, что хранилище данных хранит это строковое значение. Если это так, он может выделить новый пустой набор, если нет, он может прочитать свойство как набор.
Поведение Java Set связано с тем, что Java Collections являются ссылочными типами, которые по умолчанию имеют значение null.
Чтобы создать пустой набор, объявите его следующим образом:
@Persistent
private Set<Long> uvw = new HashSet<Long>();
или используя некоторую другую реализацию Set
с правой стороны. HashSet
является наиболее часто используемым типом Set. Другими интересными типами наборов являются два поточно-безопасных набора CopyOnWriteArraySet
и ConcurrentSkipListSet
; также тип упорядоченного набора LinkedHashSet
и тип Sorted Set TreeSet
.
Это может сработать для вас
uvw = db.ListProperty(int, default=[])
Это самый комментирующий способ закорочения...