Пустой список в Хранилище данных Механизма Приложения: Java по сравнению с Python

У меня есть следующий класс модели 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 и выводом к "несовместимым" объектам.

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

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

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

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

11
задан Denis T. 14 October 2019 в 09:45
поделиться

3 ответа

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

uvw = db.ListProperty(int, default=[])
2
ответ дан 3 December 2019 в 12:05
поделиться

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

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

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

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

0
ответ дан 3 December 2019 в 12:05
поделиться

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

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

1
ответ дан 3 December 2019 в 12:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: