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,一经查实,立即删除!

相关文章

单链表实例之学生系统

单链表实例之学生系统 #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 …

查询分析器下如何备份数据库

查询分析器下如何备份数据库backupdatabasemsdb todiskd:\msdb.bakOK搞定转载于:https://www.cnblogs.com/CnKker/archive/2006/09/26/515318.html

Inside Dynamics Axapta源代码赏析(四)

第八章:Developing Applications Using Business Connector 这一章的代码主要演示如何通过Business Connector与Axapta交互在Dynamics Axapta的客户端安装目录中找到Microsoft.Dynamics.BusinessConnectorNet.dll这个文件,添加到VS.NET的工程中.1.HelloWorldBC.csclassHelloWor…

信号之函数的可重入性

信号之函数的可重入性 在调用某个函数过程中出现中断信号&#xff0c;且改信号处理函数中再次调用该函数&#xff0c;访问全局、静态变量的函数是不可重入函数。 前后数据不一致&#xff0c;函数是不可重入的&#xff0c;特点&#xff1a;函数中使用全局变量或静态变量。 前后数…

ASP.NET 中处理页面“回退”的方法

我们在编写基于 ASP.NET 的应用程序时&#xff0c;如果代码执行出错或检测到异常&#xff0c;一般会提示用户“返回”或“回退”&#xff0c;或者在多步操作、列表/详细的查看界面中&#xff0c;也会给用户提供回退到上一页面的链接&#xff0c;对于这种情况&#xff0c;大家很…

编辑器

1.FCKeditor 编辑器 FCKeditor is compatible with most internet browsers which include: IE 5.5 (Windows), Firefox 1.0, Mozilla 1.3 and Netscape 7. 最新版本:FCKeditor 2.0 语言环境:多国语言特性功能:所见所得,支持平台众多,支持XHTML 1.0,文本格式设置,常见的编辑,复…

VSTO---excel编程 [待续] [12月5日更新,详见文档下面]

最近比较闲了&#xff0c;考试也快要到了。但是编程技术方面还是不能掉啊.现在开始VSTO编程之旅了。这个话题是连Blog的。所以有兴趣的Blog之友&#xff0c;技术之士&#xff0c;可以匿名或者非匿名的评论&#xff0c;交流。对了&#xff0c;下面的代码都是本人写的&#xff0c…

Rose与PowerDesigner:两款建模工具对比分析比较

一、 二者的出身 作为世界最著名的两大CASE工具&#xff0c;Rational Rose和PowerDesigner的名声可谓如雷贯耳。Rose是当时全球最大的CASE工具提供商Rational的拳头产品&#xff0c;UML建模语言就是由Rational公司的三位巨头Booch、Rumbaugh和Jacobson发明的&#xff0c;后来R…

c#活动目录操作

添加引用 System.DirectoryServices导入命名空间 using System.DirectoryServices;srvip "192.168.1.1"; dn "DCl,DCcom";user "administrator"; pwd "123"; DirectoryEntry de;denewDirectoryEntry("LDAP://"srvip &quo…

[导入]Ajax使用初步

文章来源:http://blog.csdn.net/21aspnet/archive/2007/03/19/1534299.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/20/816309.html

CodeForces 570B,C

CodeForces 570B 题意&#xff1a;给定n和m&#xff0c;然后再&#xff08;1-n&#xff09;中随机取出c&#xff0c;求一个m使得 的概率最大&#xff0c;概率一样时输出最小的m。 思路&#xff1a;只需要看1到m-1和m1和n的最大的那一边就可以了&#xff0c;坑是n1的情况和n为…

验证码(转)

把下面代码存为一个文件code.aspx。另一个文件里调用<img src"code.aspx">using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebCo…

ASP.NET 2.0 的数据源、数据绑定控件概述与区别

一、Render UI 1 GridView GridView 控件用来在表中显示数据源的值。每列表示一个字段&#xff0c;而每行表示一条记录。GridView 控件支持下面的功能&#xff1a; 绑定至数据源控件&#xff0c;如 SqlDataSource。 内置排序功能。 内置更新和删除功能。 内置分页功能。 内…

[导入]javascript总结

1.动态添加一行&#xff0c;和删除当前行<script> var count0; function ff() { var txt1document.getElementById("Text1"); var table1document.getElementById("table1"); rowNotable1.rows.length; Trtable1.insertRow(rowNo); Tr.id"tr&qu…

求助:DataGrid加行号的问题

我的数据是fname,lnameprivatevoidPage_Load(objectsender, System.EventArgs e) { if(!IsPostBack) { myConnectionnew SqlConnection("server127.0.0.1;uidsa;pwdsa;databaseqqq;"); strSQL"SELE…

CVS的使用教程(转)

、什么是CVS? CVS - Concurrent Versions System&#xff08;并发版本管理系统&#xff09;是一个版本控制管理系统&#xff0c;它是目前最为广泛使用的一个系统。 在多人共同开发一个大型项目时&#xff0c;源代码的维护和版本维护是一件令人头疼的事情&#xff0c;由于多人开…

压缩图片上传到数据库

保存到数据库public int DyfcListInsert(int id,string name,string username,string content,Byte[] photo) { string sql "S_DyfcList_Insert"; SqlCommand sqlcmd new SqlCommand(sql,DwzxConfiguration.ConnectDB() ,DwzxConfigu…

使用CodeDom生成程序集

usingSystem;usingMicrosoft.CSharp;usingSystem.CodeDom.Compiler;usingSystem.CodeDom;namespaceTest.CUI{ class Program { static void Main() { // 创建编译器对象 CSharpCodeProvider p new CSharpCodeProvider(); ICodeCompiler cc p.CreateCo…

汇编语言——第1次上机实验

准备&#xff1a; 硬件&#xff1a;pc机&#xff0c;32位win操作系统&#xff0c;能够运行dos&#xff0c;某些64位win10系统可能会不支持 软件&#xff1a;masm程序 实验内容&#xff1a; 1.winr运行dos&#xff0c;cd到指定的masm目录&#xff08;为了调试方便&#xff0c;所…