java - 将 XText 模型实例序列化和反序列化为 OutputStream

标签 java serialization xtext emf ecore

我有以下用例。我需要通过网络以某种序列化格式传输 XText 模型实例。为此,我需要在客户端序列化模型,将其作为某种 POST 请求的正文发送,然后在服务器端反序列化。

当我发出发送请求时,我只能访问模型的对象结构。我不再拥有创建模型的文件(这是可能的,但它会破坏我的架构的整洁性并使测试变得非常复杂)。

我根据 StackOverflow 上的一些线程和其他网站提供的序列化 XText-Model 教程创建了以下代码来序列化模型

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);

但我不知道如何反序列化此序列化调用的结果。

然而,我的问题更为基本,因为上面的代码可能是完全错误的方法。不幸的是,我在文档或网络上的其他地方没有找到太多关于此的信息。

长话短说: 序列化 XText 对象模型并再次反序列化的最佳方法是什么?

最佳答案

第一行根本不属于这里,只需将其删除即可。

您是如何创建/获取对象“场景”的? 如果它已经用 Xtext 解析,您可以获得如下序列化器:

((XtextResource)scenario.eResource()).getResourceServiceProvider
                                     .get(ISerializer.class)

关于java - 将 XText 模型实例序列化和反序列化为 OutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33121077/

相关文章:

java - 字节码与字节流(序列化)

java - 读取序列化文件时获取列表中的前几个元素,同时将其他元素保留在内存中

guava - 使用标准库组合两个可迭代对象 -- 或 -- 映射与多个可迭代对象

JAVA无法看到面板中添加的组件

java - 有没有办法从Java API中的特定偏移量开始消费kafka主题?

serialization - 如何将 Ballerina 记录值序列化到 `byte[]` 或从 0x104567910 反序列化?

java - 如何在 Xtext 语法中允许一行 Java 代码

gradle - 使用gradle定义生成器代码位置以构建xtext和xtend

java - 随着循环迭代次数的增加,平均运行时间会减少吗?

Java - 如何仅更改 JLabel 的一部分字体/添加边框