EMF的一些总结(2)——关于EMF的序列化

关于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映射到物理文件:
None.gifURIConverter converter = new URIConverterImpl();
None.gif
None.gifURI uri1 
= URI.createURI("http:///somemodel.ecore");
None.gifURI uri2 
=
None.gif  URI.createURI(
"platform:/resource/project/somemodel.ecore");
None.gifconverter.getURIMap().put(uri1, uri2);
None.gif
在如下面代码:
None.gifURI normalized = converter.normalize(uri1);
None.gifSystem.out.println(normalized);
None.gif
打印的结果是: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的机制,如:
None.gifResource resource = dot.gif
None.gifItem item 
= (Item)resource.getEObject("//@orders.0/@items.2");
None.gif
None.gifItem item 
= dot.gif
None.gifString fragment 
= resource.getURIFragment(item);
None.gif
上面代码中的两个方法,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的源代码
None.gifpublic interface Resource extends Notifier
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif  
interface Factory
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    Resource createResource(URI uri);
InBlock.gif
InBlock.gif    
interface Descriptor
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      Factory createFactory();
ExpandedSubBlockEnd.gif    }

InBlock.gif    
interface Registry
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      Factory getFactory(URI uri);
InBlock.gif
InBlock.gif      Map getProtocolToFactoryMap();
InBlock.gif
InBlock.gif      String DEFAULT_EXTENSION 
= "*";
InBlock.gif
InBlock.gif      Map getExtensionToFactoryMap();
InBlock.gif
InBlock.gif      Registry INSTANCE 
= new ResourceFactoryRegistryImpl();
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}

None.gif
None.gif

下面是Registry中的getFactory()方法的算法(引用原文):
  1. Check for a factory in the protocolToFactoryMap, using the scheme of the URI.

  2. If nothing was found, check the extensionToFactoryMap using the file extension of the URI.

  3. If still nothing was found, check the extensionToFactoryMap using the DEFAULT_EXTENSION (that is, the wildcard character "*").

  4. If no extension match was found, call the delegatedGetFactory() method. This allows you to supply your own factory registry, with its own lookup criteria.

  5. If a descriptor was found, instead of an actual factory, call the createFactory() method on the descriptor to create the factory.

  6. Finally, return the factory if one was found, or null.

tip:emf缺省的序列化方式是XMI。因此,如果没有找到相应注册的factory缺省的就会返回以*注册的缺省的factory,这个factory是针对XMI的factory,即XMIResourceFactoryImpl。如,对于 XMIResourceFactoryImpl的扩展点声明:

 

None.gif<extension point = "org.eclipse.emf.ecore.extension_parser">
None.gif  
<parser type="*"
None.gif     class
="org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl"/>
None.gif
</extension>
None.gif
None.gif
  1. 当非插件应用的时候,可以通过手工的方式来注册factory,如:
None.gifResource.Factory.Registry.INSTANCE.
None.gif  getExtensionToFactoryMap().put(
"*"new XMIResourceFactoryImpl());
None.gif

转载于:https://www.cnblogs.com/youngerbaby/archive/2006/05/07/393043.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uva 12563——Jin Ge Jin Qu hao

题意&#xff1a;给出n首歌及每首歌的播放时间&#xff0c;然后在t秒内唱这些歌&#xff0c;最后的剩余时间要大于0&#xff1b; 思路&#xff1a;01背包问题&#xff0c;对于没次选择&#xff0c;只有取或不取两种状态&#xff0c;只需在这两种状态中找到最优的策略即可。 cod…

可以在xml中靠增加属性来实现分组

可以在一篇xml文档中&#xff0c;靠增加一个行的属性&#xff0c;来进行排序。有这方面需求的folks&#xff0c;请参考如下代码&#xff1a; private void UniteHtmlCell(ref XmlDocument xDocument) { int rowsCount xDocument.DocumentElement.ChildNodes…

uva 1220——Party at Hali-Bula

题意&#xff1a;公司里n个人&#xff0c;要举办一场party&#xff0c;但是到场的人不能碰到他的直隶上司&#xff0c;问最多能到场多少人。 思路&#xff1a;树形dp&#xff0c;就是求在树上的最大独立集合&#xff0c;加唯一性特判。dp(u&#xff0c;0)表示不选u点的条件最大…

Vi编辑器的基本使用方法

Vi编辑器的基本使用方法- Tag&#xff1a; linux Vi 使用方法 来自&#xff1a;Linux公社 vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;它的强大不逊色于任何最新的文本编辑器&#xff0c;这里只是简单地介…

uva 10285——Longest Run on a Snowboard

题意&#xff1a;在一个R*c的矩阵上找一条高度严格递减的最长路&#xff0c;起点任意&#xff0c;每次可以走上下左右。 思路&#xff1a;DAG上的最长路问题&#xff0c;直接套用记忆化搜索的模板&#xff0c;dp&#xff08;i&#xff0c;j&#xff09;max&#xff08;dp&#…

DB2应用经验

//建立数据库DB2_GCB CREATE DATABASE DB2_GCB ON G: ALIAS DB2_GCB USING CODESET GBK TERRITORY CN COLLATE USING SYSTEM DFT_EXTENT_SZ 32 //连接数据库 connect to sample1 user db2admin using 8301206 //建立别名 create alias db2admin.tables for sysstat.tables; CR…

uva 10118 ——Free Candies

题意&#xff1a;桌子上有4 堆糖果&#xff0c;要从这四堆糖果中取出5个&#xff0c;如果5个中有相同的颜色则把他们拿出来放到口袋&#xff0c;求最多放多少糖果。 思路&#xff1a;DAG最长路问题。需要把问题转化成DAG的问题&#xff0c;以个数作为转移的状态&#xff0c;当达…

uva 1218——Perfect Service

题意&#xff1a;有n个机器组成的树形结构&#xff0c;要求一台服务器必须连接一台电脑&#xff0c;求使用的最少的服务器。。 思路&#xff1a; 树形DP&#xff0c;和前面的有道题目类似。在dfs遍历树的时候找到选当前结点和不选当前节点的最大状态&#xff0c;多一个两个都不…

SYBASE灾难备份方案

SYBASE灾难备份方案 本方案主要从计算机系统的可用性出发&#xff0c;给出了高可用性问题的一般描述及群机方式的特色&#xff0c;进而提出了灾难备份的特殊考虑及SYBASE的灾难备份方案。 一、系统高可用性&#xff08;High Availability&#xff09;... 2 1、高可用性方案... …

uva 10817——Headmaster's Headache

题意&#xff1a;某个学校有m个老师和n个求职者&#xff0c;需要讲授s个课程&#xff0c;已知每个人的工资c和能交的课程&#xff0c;求花费最小使得每门课程都至少有两个人教。 思路&#xff1a;状压dp&#xff0c;将每个老师要交的课程压缩成一个数&#xff0c;然后对于每门课…

单链表实例之学生系统

单链表实例之学生系统 #include<stdio.h> #include<stdlib.h>#define NAME_LEN 20typedef struct node {int number;char *name;struct node *next; } node_t;node_t *g_head; int add_stu() {node_t *new, *tmp;tmp g_head;char *name;new (node_t *)malloc(si…

公司培训文档-JavaScript[对象.属性]集锦

SCRIPT 标记 用于包含JavaScript代码. 属性 LANGUAGE 定义脚本语言 SRC 定义一个URL用以指定以.JS结尾的文件 windows对象 每个HTML文档的顶层对象. 属性 frames[] 子桢数组.每个子桢数组按源文档中定义的顺序存放. feames.length 子桢个数. self 当前窗口. parent …

uva 1252——Twenty Questions

题意&#xff1a;给定n个物品&#xff0c;每个物品用01串表示&#xff0c;表示具备与否某个特征&#xff0c;然后每次可以询问一个特征&#xff0c;问最少询问几次能够确定一个物品。 思路&#xff1a;状压Dp&#xff0c;将这些数的特征压缩成一个数&#xff0c;把询问过的和没…

[转]“UPA 中国”北京行业聚会笔录

来自:白鸦http://www.uicom.net/blog/article.asp?id409-----------“UPA 中国”北京行业聚会笔录---------------------------与会嘉宾&#xff1a;清华美院信息艺术设计系系主任&#xff1a;鲁晓波中国设计业十大杰出青年评选办公室主任&#xff1a;邢雷 清华大学工业工程系…

系统I/O小程序-文件拷贝

系统I/O小程序-文件拷贝 使用系统IO函数编写 ./syscopy src des #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h>/** * …

uva 10934—— Dropping water balloons

题意&#xff1a;给定K个气球&#xff0c;然后n层楼的高度&#xff0c;求确定气球的硬度&#xff08;站在多高能摔破&#xff09; 思路&#xff1a;递推。dp&#xff08;i&#xff0c;j&#xff09;表示最优&#xff0c;那么即dp&#xff08;i-1&#xff0c;j-1&#xff09;1最…

商海致富独家秘诀:微笑可以当钱花

郭俭&#xff0c;深圳凯创电子设备有限公司营销总经理。当过教师&#xff0c;坐过机关&#xff0c;最后下海了&#xff0c;来到深圳。记者到他办公室采访的时候&#xff0c;第一眼看到的&#xff0c;是他温暖而质朴的微笑。这无言的微笑&#xff0c;让人觉得站在面前的&#xf…

标准I/O小程序-文件拷贝

标准I/O小程序-文件拷贝 #include <stdio.h> #include <string.h>/** * * ./mycopy src des */ int main(int argc, char *argv[]) {FILE *des, *src;char buf[128];int ret, i, j, count;if (argc < 3) {printf("The argc is wrong!\n");retu…

uva 12105——Bigger is Better

题意&#xff1a;给定n个火柴&#xff0c;求能够摆出的最大的数。 思路&#xff1a;递推&#xff0c;dp&#xff08;i&#xff0c;j&#xff09;表示i根火柴拼出除以m余数为j的最大的数&#xff0c;然后递推用dp&#xff08;i&#xff0c;j&#xff09;*10k更新dp&#xff08;i…

[导入]Google Earth坐标集(能更看清这个世界喽!)

这里收集了一些有趣的地理坐标&#xff0c;使用方法很简单&#xff0c;先启动Google Earth&#xff0c;然后选择软件左面的部分“Fly to(飞至)”在下面的框中粘贴坐标&#xff0c;按回车即可“飞”到这个地方。珠穆朗玛峰(Mount Everest)&#xff1a;27.9782502279, 86.9221941…