У меня есть следующий класс модели Java в Механизме Приложения:
public class Xyz ... {
@Persistent
private Set<Long> uvw;
}
При сохранении объектного Xyz с пустым множеством uvw в Java, я получаю "пустое" поле (как перечислено в appengine средстве просмотра хранилища данных). Когда я пытаюсь загрузить тот же объект в Python (через remote_api), как определено следующим классом модели Python:
class Xyz(db.Model):
uvw = db.ListProperty(int)
Я получаю "BadValueError: Свойство uvw требуется".
При сохранении другого объекта того же класса в Python с пустым списком uvw средство просмотра Хранилища данных печатает "недостающее" поле.
По-видимому пустая обработка устройства хранения данных списков отличается между Java и Python и выводом к "несовместимым" объектам.
Таким образом мой вопрос: Есть ли путь к, также:
Или любое другое предложение о том, как обработать пустое поле списка на обоих языках.
Спасибо за Ваши ответы!
Это должно работать, если вы присвоите свойству Python значение по умолчанию:
uvw = db.ListProperty(int, default=[])
Поведение Java Set обусловлено тем, что Коллекции Java являются ссылочными типами, которые по умолчанию имеют значение NULL.
Чтобы фактически создать пустой Set, объявите его следующим образом:
@Persistent
private Set<Long> uvw = new HashSet<Long>();
или используйте другую реализацию Set
с правой стороны. HashSet
- наиболее часто используемый тип Set. Другими интересными типами наборов являются два потокобезопасных набора CopyOnWriteArraySet
и ConcurrentSkipListSet
; также тип упорядоченного набора LinkedHashSet
и тип сортированного набора TreeSet
.
Я использую низкоуровневый java api, поэтому, возможно, то, что я делаю, будет другим. Но прежде чем сохранить структуру данных типа коллекции в хранилище данных, я преобразовываю ее в то, что хранилище данных обрабатывает естественным образом. Это будет включать в основном строки и байтовые массивы.
Похоже, движок Java-приложений интерпретирует пустой набор как нулевое значение. И python неправильно считывает это нулевое значение. Вы можете попробовать сохранить пустой набор в качестве строкового значения «пустой набор». Затем попросите python проверить, хранится ли в хранилище данных это строковое значение. Если это так, он может выделить новый пустой набор, если нет, он может прочитать свойство как набор.