2016-11-14 4 views
1

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

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/
Мне нужно создать интерфейс и получить его из serializable, но у меня нет такой опции. См. Прикрепленный скриншот.

Serializable

ответ

3

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

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

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

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

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

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

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

Смежные вопросы