EMF NotSerializableException

Я создаю приложение на Java с помощью EMF.
Я использую Java8 JDK.
Все, что мне нужно, это сохранить экземпляр класса моей модели.
Я запускаю код в режиме отладки на сервере WildFly 10 удаленно из Eclipse.

private String getXml(Audit audit) throws NeoflexException {
    XMLResource res = new XMLResourceImpl();        
    res.getContents().add(audit);       
    StringWriter sw = new StringWriter();

    try {
        res.save(sw, null);
    } catch (IOException e) {
        throw new NeoflexException(e);
    }

    return sw.toString();   
}

При сериализации я получаю NotSerializableException.
Я вижу, что сгенерированный класс аудита не помечен как Serializable.
Я не могу редактировать сгенерированный код, однако у меня также нет возможности пометить этот класс на диаграмме как сериализуемый.
Как описано здесь: https://www.eclipse.org/forums/index.php/t/261475/
Мне нужно создать интерфейс и вывести его из сериализуемого, но у меня нет такой возможности. Смотрите прикрепленный скриншот.

Сериализуемый


person Olga Pshenichnikova    schedule 14.11.2016    source источник


Ответы (1)


Как правило, сериализуемость EMF связана не с интерфейсом ISerializable, а с иерархией сдерживания, сформированной между элементами модели. Кроме того, вы не должны вообще заставлять интерфейсы EMF расширять интерфейс ISerializable, поскольку это вводит в заблуждение (объекты модели EMF не должны быть сериализуемыми с использованием базовой сериализации Java).

По сути, экземпляры ваших классов должны быть для дерева сдерживания: один объект должен быть корнем дерева, а все остальные экземпляры должны содержаться в нем. Затем вы можете сохранить всю эту иерархию сдерживания в файл, добавив корень модели в ресурс.

Не зная конкретного сообщения об ошибке в исключении, я бы первым советом проверил, ссылается ли элемент аудита на какой-либо другой элемент модели, потому что, если на этот элемент ссылается не включающее отношение, сериализация завершится ошибкой.

Чтобы задать включение отношения, отредактируйте свою метамодель (файл Audit.ecore) и задайте для ссылки свойство с именем containment true. Однако вы должны убедиться, что вмещающее поддерево может быть настроено правильно: существует только один корневой элемент модели; ко всем остальным элементам можно получить доступ по ровно одному пути ссылок вмещения из корня модели. Если на элемент ссылается перекрестная ссылка, он также должен быть включен в иерархию включения, чтобы сериализация EMF (Resource.save) работала.

Еще одна проблема, которую я вижу, заключается в том, что вы создаете файл ресурсов EMF вручную, без какого-либо URI (который определяет, где вы хотите сохранить свою модель) и без какого-либо набора ресурсов (который используется для разделения ваших моделей на несколько файлов/ресурсов с отдельными иерархиями сдерживания) .

Другими словами, вы должны создать экземпляр ResourceSet и использовать его для создания экземпляров ресурсов вашей модели.

Для получения более подробной информации я предлагаю проверить основной и специальное руководство по сериализации на vogella.com.

person Zoltán Ujhelyi    schedule 14.11.2016