Ошибка EMF: атрибут "XYZ.Attribute_name" не является временным, или он должен иметь тип данных, который можно сериализировать
Я создаю модель ECore. Я создал EClass, и внутри него я хочу создать элемент данных, который является списком. Поэтому я создал EAttribute типа EEList.
Однако, когда я пытаюсь создать файл genmodel, я получаю сообщение об ошибке
атрибут "XYZ.Attribute_name" не является временным, или он должен иметь сериализуемый тип данных.
Это также дает предупреждение высказывание
Универсальный тип, связанный с классификатором 'EEList', должен иметь 1 тип аргумента (ов), чтобы соответствовать количеству параметра (ов) типа классификатора.
Может кто-нибудь сказать мне, что я делаю не так? Я не мог понять, как установить E
в EEList<E>
,
1 ответ
Первая ошибка
Первая ошибка, вероятно, исчезнет после того, как вы исправите вторую ошибку. Я пишу объяснение здесь, но вам, вероятно, не придется иметь дело с ним, чтобы решить вашу проблему.
Это связано с тем, что для сохранения на диск атрибуты EDataTypes должны быть преобразованы в текстовый формат.
Есть два способа обеспечить это:
- Реализуйте преобразование в и из строк для используемого EDataType. Стандартные EDF-типы EMF уже делают это, но если вы создали свой собственный EDataType, вам придется делать это вручную.
- Используйте тип Java для EDataType, который является сериализуемым. Таким образом, он должен реализовать
Serializable
интерфейс и обеспечить сериализацию операций. Многие стандартные классы Java, такие какString
а такжеInteger
уже сделай это.
Другое решение - установить для свойства Transient атрибута значение true. Атрибут не будет сохранен, и его EDataType не нуждается в сериализации.
Вторая ошибка
Обычный способ создания атрибута списка - установить для свойства Upper Bound атрибута значение, отличное от 1. Чтобы создать атрибут списка, который может содержать любое количество элементов, установите для Upper Bound значение -1, что означает " Неограниченный".
Тип EAttribute должен быть установлен на тип элемента, а не на тип списка.
Сгенерированный код Java будет содержать свойство с типом EList<ElementType>
,