关于EMF的序列化
对于EMF的序列化有几个比较重要的接口:Resource,ResourceSet,Resource.Factory,URIConverter。这些接口的主要作用就是保存模型到持久化存储介质,或者从持久化存储介质加载模型。
1.关于URI(Uniform Resource Identifier)
在EMF 中是通过URI来标识package的,并且同过URI来唯一的确定resources。URI包括三个部分:a scheme, a scheme-specific part和an optional fragment。scheme主要决定了访问资源的协议;比如:Platform:/resource/……中的platform。scheme- specific part 包含一些authority,device和一些segments,如file:/c:/dir1/dir2/myfile.xml,file是协议,没有authority,c:是device,剩下的3个是segments。URI fregment标识了resource内部的某个具体的内容。如:file:/c:/dir1/dir2/myfile.xml#loc中的#loc。 EMF通过带有fregment的URI来访问资源中的EObjects。
2.关于URIConverter
URIConverter的作用是normalize一个输入URI,使之成为一个实际的针对某个resource的URI。它可以把namespace URIs(比如:http:///com/example/epo2.ecore)映射到物理文件的URIs, 或者重定向旧的(或别名)的URI参考到一个具体的实际的location。
一个URIConverter维护一个URI到URI的映射集合。比如,把一个命名空间URI映射到物理文件:
URIConverter converter = new URIConverterImpl();
URI uri1 = URI.createURI("http:///somemodel.ecore");
URI uri2 =
URI.createURI("platform:/resource/project/somemodel.ecore");
converter.getURIMap().put(uri1, uri2);
在如下面代码:
URI normalized = converter.normalize(uri1);
System.out.println(normalized);
打印的结果是:platform:/resource/project/somemodel.ecore
URIConverter.normalize()方法只是简单的同过映射的map把key替换成了相应的value。
URIConverter的最原始是应用在resource sets,用来定位resources.
3.关于Resource和ResourceSet
Resource 表示一个持久化的EOjbects的容器;ResourceSet表示一组Resource的集合,集合中的Resource同时创建或加载。 Resource中比较重要的就是save和load方法,还有通过URI fregments访问资源中的Object的机制,如:
Resource resource =
Item item = (Item)resource.getEObject("//@orders.0/@items.2");
Item item =
String fragment = resource.getURIFragment(item);
上面代码中的两个方法,getEObject通过带有fregment的URI获得一个EObject,与之相反的方法getURIFragment()通过EObject获得相应的fragment path。
ResourceSet中有些重要的方法:
createResource()创建一个空的Resource;
getResource()通过resource的URI来创建Resource;
getEObject(),通过URI中的fregment来获得具体的EObject对象。
4.关于Resource.Factory
用来创建Resource,resource factory 要注册到Registry实例中。一个factory 可以通过多种方式的URIs来注册,包括URI scheme或者URI的extension。在插件方式的应用中,通过扩展点的方式在插件加载的时候注册descriptor。
下面是Resource的源代码
public interface Resource extends Notifier
{
interface Factory
{
Resource createResource(URI uri);
interface Descriptor
{
Factory createFactory();
}
interface Registry
{
Factory getFactory(URI uri);
Map getProtocolToFactoryMap();
String DEFAULT_EXTENSION = "*";
Map getExtensionToFactoryMap();
Registry INSTANCE = new ResourceFactoryRegistryImpl();
}
}
}
下面是Registry中的getFactory()方法的算法(引用原文):
-
Check for a factory in the protocolToFactoryMap, using the scheme of the URI.
-
If nothing was found, check the extensionToFactoryMap using the file extension of the URI.
-
If still nothing was found, check the extensionToFactoryMap using the DEFAULT_EXTENSION (that is, the wildcard character "*").
-
If no extension match was found, call the delegatedGetFactory() method. This allows you to supply your own factory registry, with its own lookup criteria.
-
If a descriptor was found, instead of an actual factory, call the createFactory() method on the descriptor to create the factory.
-
Finally, return the factory if one was found, or null.
tip:emf缺省的序列化方式是XMI。因此,如果没有找到相应注册的factory缺省的就会返回以*注册的缺省的factory,这个factory是针对XMI的factory,即XMIResourceFactoryImpl。如,对于 XMIResourceFactoryImpl的扩展点声明:
<extension point = "org.eclipse.emf.ecore.extension_parser">
<parser type="*"
class="org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl"/>
</extension>
当非插件应用的时候,可以通过手工的方式来注册factory,如:
Resource.Factory.Registry.INSTANCE.
getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl());
分享到:
相关推荐
EMF的核心功能包括:模型定义、代码生成、模型编辑、模型验证、模型转换、序列化和反序列化。通过EMF,开发者可以创建高度可定制的领域特定语言(DSLs)和图形用户界面(GUIs),从而极大地提高了开发效率和软件质量...
- 用户可以自定义XML解析器和序列化器,以适应特定的XML格式或需求。 - EMF还支持插件机制,允许开发人员扩展其功能,如添加验证规则、转换逻辑等。 8. **应用场景** - EMF广泛应用于软件建模、配置管理、数据...
4. 序列化和反序列化:EMF支持将模型对象序列化为XML,便于存储和传输,也可以从XML数据中反序列化回模型对象。 5. 集成其他Eclipse技术:如Xtext用于生成自定义编程语言,M2T用于模型到文本转换,M2M用于模型之间的...
4. 生成代码:使用EMF的代码生成器,将模型转换为Java类和XML序列化代码。 5. 编写应用程序:使用生成的Java类进行编程,利用EMF提供的API操作模型。 总结,Java开发工具EMF插件是Eclipse IDE中的一个强大工具,它...
4. **Gson** 是一个将Java对象转换为JSON字符串,反之亦然的库,非常适用于数据序列化和反序列化。 5. **GWTORM** 和 **GWTJSONRPC** 可能是GWT特定的库,分别用于对象关系映射和远程过程调用,帮助在GWT应用中处理...
3. **序列化与反序列化**:EMF支持将模型实例序列化为标准的XMI格式,这是一种通用的模型交换格式,同时也支持直接存储为XML。 4. **API支持**:提供了一组丰富的API,允许开发者在程序中创建、操作和管理模型实例...
EMF提供了一整套工具和服务,包括模型的序列化、反序列化、验证和转换,使得开发基于模型的系统变得更加高效。 在EMF中,模型通常以Ecore(Eclipse Core Meta-Object Facility)的形式存在,这是一个元模型定义语言...
2. **生成代码**:一旦模型定义完成,EMF可以自动生成对应的Java类和接口,以及用于持久化和反序列化的XML架构。 3. **创建编辑器**:使用Eclipse的GEF(Graphical Editing Framework)或GMF(Graphical Modeling ...
EMF 提供了数据模型的创建、存储、序列化以及与Java对象之间的映射。开发者可以通过EMF定义自己的领域特定语言(DSL),并利用EMF生成对应的Java类和API,从而简化模型的编程和管理。此外,EMF还支持XMI(XML ...
4. **序列化(Serialization)**:EMF支持将模型实例序列化为XML格式,方便存储和交换。 5. **编辑器(Editor)**:EMF提供了用于创建图形化或文本编辑器的工具,使用户可以直观地编辑模型实例。 6. **转换...
EMF(Eclipse Modeling Framework)是Eclipse中用于构建模型驱动工程的重要组件,它是基于Java的框架,提供了一套API来支持数据建模、持久化、序列化以及生成代码等任务。 EMF API文档是开发者理解和使用EMF的关键...
它们支持序列化,可以持久化到磁盘,也可以通过网络进行传输。此外,EMF提供了丰富的API,允许动态修改模型,实现模型的加载、保存和验证。 **高级话题** EMF支持许多高级特性,例如: 1. **逆向工程**:可以从现有...
2. **代码生成**:一旦元模型定义完成,EMF可以自动生成Java源代码,包括数据对象、访问这些对象的API以及序列化和反序列化的逻辑。这极大地简化了处理结构化数据的工作。 3. **数据绑定**:EMF SDO提供了数据绑定...
这个版本可能包含了对模型对象的创建、序列化、反序列化以及与模型相关的事件处理等功能。它对于那些希望在Eclipse环境下开发图形化编辑器或基于模型的应用程序的开发者来说是必不可少的。 “visual editor”通常指...
EMF包含了图形设备接口(GDI)调用的序列,这些调用描述了如何绘制图像。在转换过程中,我们需要解析EMF文件中的这些调用,并根据需要调整大小和比例(scale),然后将它们转换为BMP文件的像素数据。 转换过程通常...
EMF还支持序列化和反序列化,使得流程模型可以被保存和加载到数据库中。通过EMF,Activiti Designer能够实现对流程图的直观表示,包括泳道、任务、网关等元素,并且可以生成符合BPMN标准的XML流程定义文件。 在处理...
- 实现数据的序列化和反序列化,方便数据交换和持久化存储。 - 利用SDO的事件机制,实现对数据变化的监听和响应。 总的来说,"emf-sdo-runtime-2.2.0.zip" 提供了在Eclipse环境下使用SDO技术的基础,使得开发人员...
EMF的核心理念是将数据结构转换为Java类,这些类能够直接在代码中使用,也可以通过XML或其他序列化格式进行持久化。这种模型-视图-控制器(Model-View-Controller, MVC)的设计模式允许开发者分离业务逻辑和用户界面...