Сериализация и десериализация экземпляра модели XText в OutputStream

У меня есть следующий вариант использования. Мне нужно передать экземпляр модели XText по сети в каком-то сериализованном формате. Для этого мне нужно сериализовать модель на стороне клиента, отправить ее как тело какого-то POST-запроса и десериализовать на стороне сервера.

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

Я создал следующий код для сериализации модели на основе некоторых потоков здесь, в StackOverflow, и учебных пособий, доступных на других веб-сайтах, для сериализации модели XText.

Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap( ).put("xtextbin", new XMIResourceFactoryImpl());
Injector injector = Guice.createInjector(new ScenarioRuntimeModule());
Serializer serializer = injector.getInstance(Serializer.class);
System.out.println(serializer.serialize(scenario));

Однако это не работает, и я получаю следующую ошибку: com.google.inject.CreationException: ошибки создания Guice:

1) Error injecting constructor, org.eclipse.emf.common.util.WrappedException: org.eclipse.emf.ecore.resource.impl.ResourceSetImpl$1DiagnosticWrappedException: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Ungültiges Byte 1 von 1-Byte-UTF-8-Sequenz.

Проблема скорее всего в XMIResourceFactoryImpl, которым я не умею правильно пользоваться.

Другой подход может заключаться в использовании:

String serializedScenario = ModelUtils.serialize(scenario);

Но я не знаю, как десериализовать результат этого вызова сериализации.

Однако мой вопрос более простой, поскольку приведенный выше код может быть совершенно неправильным подходом. К сожалению, я не нашел много информации об этом ни в документации, ни где-либо еще в Интернете.

TL;DR: Как лучше всего сериализовать объектную модель XText и снова ее десериализовать?


person ali    schedule 14.10.2015    source источник


Ответы (1)


Первая строка здесь вообще не при чем, просто удалите ее.

Как вы создали/получили объект «сценарий»? Если он уже был проанализирован с помощью Xtext, вы можете получить сериализатор следующим образом:

((XtextResource)scenario.eResource()).getResourceServiceProvider
                                     .get(ISerializer.class)
person Sven Efftinge    schedule 20.10.2015
comment
Наконец-то вернулся к этой проблеме. Сценарий был создан с помощью Scenario scenario = ScenarioFactory.eINSTANCE.createScenario();. Если я попробую этот код, я получу null за scenario.eResource(). - person ali; 01.12.2015