物理建模语言Modelica的模型库文件序列化方法

文档序号:6354250阅读:233来源:国知局
专利名称:物理建模语言Modelica的模型库文件序列化方法
技术领域
本发明涉及一种数据的序列化和反序列化方法,尤其涉及一种多领域物理统一建 模语言Modelica模型库文件的序列化和反序列化方法。
背景技术
Modelica是一种面向对象、基于方程、采用层次化组件模型并具有模型重用性的 物理建模语言。Modelica模型库技术是Modelica的基本特征之一,是实现模型重用的直接 手段。因此,Modelica仿真平台启动后,必须首先加载Modelica模型库以供用户建模使用。 对Modelica编译器而言,传统的库加载过程依次分为读取.mo文件(即Modelica源文件), 对.mo文件进行词法/语法分析,创建Dom (文档对象模型)抽象语法树三个阶段。对.mo 文件进行词法/语法分析的工作需要消耗大量的时间,以Modelica标准模型库2. 1为例, 该库共包括144个源文件,3141个类,所有语法元素总和近50万个,利用词法/语法分析工 具Antlr 2. O分析需耗时约300秒。若每次加载模型库都如此耗时,对系统而言是低效的。
由于模型库中的模型都具备高的置信度,即其词法/语法是完全正确的,而且库 模型具有只读性,不可被用户更改,这些因素导致每次对模型库进行的词法/语法分析都 会得到完全相同的结果。因此,可以考虑通过对模型库文件的数据进行序列化和反序列化 来缩短加载模型库的时间,由于现有技术中需要对模型库文本进行词法/语法分析,目前 还没有对Modelica的模型库文件进行序列化和反序列化的方法报道。发明内容
本发明的目的是提供一种对Modelica模型库的文件数据进行序列化和反序列化 的方法,以缩短Modelica模型库的加载时间。
为达上述目的,本发明采用的技术方案是一种物理建模语言Modelica的模型库 文件序列化方法,在第一次加载模型库时,对Modelica模型库的源文件进行词法/语法分 析,创建文档对象模型抽象语法树,通过序列化技术将文档对象模型抽象语法树的数据保 存至序列化结果文件。
所述通过序列化技术将文档对象模型抽象语法树的数据保存至序列化结果文件 包括下列步骤(1)根据文档对象模型抽象语法树中数据的数据类型,用预先定义的标志符标记所需 保存的数据;(2)根据Modelica文档对象模型类系图制定对象映射表;(3)根据对象映射表将所需序列化的数据进行分类标记,标记时需区分类、类成员以 及对象所在实体文件;(4)依据Modelica编译结果进行序列化输出,序列化依照对象数据排列规则进行,每 个Modelica对象数据输出前,首先输出其分类标记,其次为数据块大小,最后为数据内 容;当指定数据不存在时,以占位符进行数据虚拟填充。3
上述技术方案中,所述占位符为预先设定的数据,一般,应选择不易发生冲突的数 据作为占位符使用。
一种物理建模语言Modelica的模型库文件的反序列化方法,读取序列化结果文 件,包括如下步骤,(1)根据Modelica文档对象模型类系图制定的对象映射表预先创建所需反序列化的 对象,并进行对象初始化,初始对象数据为空;(2)从序列化文件中读入数据,根据读取的分类标记确定向何种对象填充数据,根据 读取的数据块大小值确定对象数据的大小,最终实现读入单个的完整对象,如果读入数据 为占位符,则该对象的指定数据设置为空;(3)依据Modelica模型序列化文件中的对象结果顺序依次在内存中创建新的对象, 对象的层次关系按照序列化文件中的分类标记进行组织,从而实现在内存中重构Modelica 模型编译结果。
上述技术方案中,第一次加载模型库时,将模型库文件的词法/语法分析结果,通 过序列化技术保存至结果文件,以后每次都通过直接读取结果文件来完成模型库的加载。
模型库文件的词法/语法分析结果为Dom抽象语法树,为了将它保存到结果文件, 并且以后能通过读取结果文件还原该Dom抽象语法书对象,本发明制定了一套设计规则, 概括地说这套规则有两条1)以标志符标记需要处理的数据并区分数据类型;2)以数据排列格式保存数据之间的关系。
根据这套规则,本发明可以构建软件模块,该模块又分为两个子模块,分别负责将 内存中的Dom抽象语法树序列化为结果文件和将结果文件反系列化为内存中的Dom抽象语 法树。
由于上述技术方案运用,本发明与现有技术相比具有下列优点本发明通过预处理过程,在第一次加载模型库时,生成序列化结果文件,因而在以后加 载模型库时,只需要直接从读取结果文件即可,避免每次都模型库进行词法语法解析,大大 加快了模型库的加载速度。以Modelica 2. 1标准库为例,未使用本发明的方法时,加载时 间为300秒,使用本发明的方法后,加载时间仅为600毫秒。


图1是Dom抽象语法树的类型体系结构图,Dom抽象语法树中的节点的类型都来 自该类型体系。
图2是Modelica模型库加载方式对比图。
图3是实施例中成员变量为类对象时的数据标记示意图。
具体实施方式
实施例对Modelica模型库进行序列化处理,包括 1)制定Dom序列化规则规则1 以标志符标记需要处理的数据并区分数据类型如图1,Dom类系类型众多,序列化内容包括Dom对象的类型名,Dom对象数据,以及对4象所在文件的文件名等。本发明设计了一套标识机制,通过一系列的标志符来记录数据加 以区分。
规则1.1对类进行标记必须严格按照Modelica语言规范对Dom类型体系中各个类进行标记。Dom类系结构 是参照ModeliCa2. 1规范设计的,保存Modelica的所有文法信息,但同时,为了方便操作和 理解,将这些基本内容又做了细分和扩展并加入了和分析有关的辅助类和辅助属性。因为 只对.mo文件的词法/语言分析结果进行序列化,所以调用序列化函数前应先滤除Dom类 系中与之无关的类或类属性。
规则1. 2对类成员进行标记对Dom类型体系中各个成员进行标记,即要确定哪些成员变量需要被序列化。这其中 包括两方面内容,该成员是否被序列化,以及该成员在其所属类的所有成员变量中所处的 位置,两者缺一不可,这样才能确保反序列化时能正确的重构一个类对象。
规则1. 3对类对象或结构体对象引用的成员进行特殊标记类成员(即类对象的数据)与结果文件之间的数据传递是以标准输入输出流为载体 的。标准输入输出流可以接受任何C++内置数据类型包括const char*、int等以及标准库 string和complex类类型,并且可通过重载输入输出运算符支持用户自定义类型。
本发明已设计了重载的序列化函数,以类对象的引用为形参,对类成员分别进行 序列化操作。若重载输入输出运算符以支持Dom类系类型,功能上会与重载的序列化函数 构成重叠。因此,本发明在设计序列化机制时,底层的数据传递只使用标准输入输出流默认 的参数类型,没有对输入输出运算符进行重载,即不支持自定义类型。
因此,序列化时,在遇到成员变量为类对象或结构体对象引用时,不能简单的与输 入输出流绑定,而必须获取该对象的所有成员,依次序列化,并在此对象对应的数据段前后 进行标记,以表明标记段内的数据的特殊性。这种将数据标记成块的方式可以有效的防止 反序列化读取数据时的紊乱。附图3为成员变量为类对象时的数据标记示意图。
规则1. 4对源文件的文件名进行标记在Modelica中,类除了按照Modelica语法规定的标准方式被定义以外,还有一种外部 表示法,即通过操作系统的层次结构(文件系统或数据库)来表示本发明,所以源文件名与 Modelica类定义之间有着重要关系,因此,对象序列化时,所处源文件的文件名必须被序列 化。序列化时必须以标记表明此数据为源文件文件名。
至此,按规则1进行序列化,序列化内容(Dom对象的类型名,Dom对象数据,以及对 象所在文件的文件名等)在反序列化时将可通过标志符进行区分,并且通过对标志符的判 断可以获知哪些内容被执行了序列化操作。
规则2 以数据排列格式保存数据之间的关系在序列化过程中,必须记录类成员被序列化的顺序,以确保单个对象反序列化的成功; 必须记录对象被序列化的顺序,以确保正确的重构Dom抽象语法树。
反序列化时,如何获取这些信息之间的联系。.NET框架采用序列化引擎对数据之 间的关系进行了记录。而本发明在设计序列化机制时,并未使用类似的辅助手段,而是依靠 这些信息的排列顺序判断数据之间的关系,即,在序列化时,所有的数据是按某一顺序输出 的,保存为具有结构化信息的结果文件,反序列化时,通过控制字长来读取每个数据,通过数据读取的先后顺序判断数据之间的关系。数据排序时,必须满足以下规则 规则2. 1对象的类名称必须排列于对象数据之前反序列化时,首先获得对象的类名称,即获知了对象的类型,通过类成员定义预判将要 读取的下一数据的类型(由规则2可知,类型必为C++内置数据类型之一),根据预判结果控 制字长以确保每次读取正确的数据。因此,序列化输出时,对象的类名称必须排列于对象之前。
规则2. 2对象的成员变量的数据必须按唯一顺序排列即序列化输出时必须排列为成员1,成员2,…,成员n,或者逆序,若成员m未被序列 化,则按规则1.2输出辅助字段“占位”。
参照规则1. 2,获知对象类型后,需要通过类成员定义预判下一数据的类型。若序 列化输出时成员变量排序混乱,则必须依靠辅助列表,否则无法预判。
本发明选择前一种排列方式,即正序排列,在实现时,其逻辑性强于逆序排列。
规则2. 3源文件的文件名必须排列于首位源文件的文件信息是Modelica类定义在编译后所隐含的重要信息之一,必须通过类 的源文件信息才能判断此类是否为顶层类,因此,源文件必须置于Modelica类定义之前, 即所有序列化内容的首位。
规则2. 4数据结构的大小属性排列于其他内部数据之前对于list、vectoiNmap等具有size属性的数据结构,在序列化其包含的数据前,必须 先序列化其size,这样才能保证反序列化时精确的按其原始大小进行重构。
至此,基于规则1和规则2,可以设计出一套的基于Dom的合理的序列化机制。
2)设计Dom序列化和反序列化模块 首先,确定数据的存储格式。
序列化时,被序列化的类对象的数据绑定至标准输出流,由标注输出流确定其输 出格式(二进制或文本格式)并保存至结果文件。因此可以选择的存储格式有二进制格式、 文本格式,以及由文本格式演化的XML格式。
二进制格式存储与读取效率最高,因为数据本身在内存中就是以二进制的形式存 在;文本格式效率次之,但作为明文存储方式,可以直观的显示数据的信息;XML格式效率 较前两者低,因为XML格式要求数据转换为文本后,还需要按XML文法添加辅助字段。但以 XML格式存储,不仅可以直观的显示数据内容,还可以显示数据之间的层次关系,并可作为 数据交换的载体用于网页显示和基于web的仿真等。
本发明设计序列化机制时,效率问题始终置于首位,因此本发明采用二进制格式 存储序列化文件结果,序列化时也只提供二进制这一种输出格式。
确定哪些类的对象需要被序列化时,设计方案有二 a利用列表记录所有需要被序列化的对象的类型。在对象被序列化前,先在列表中查 找是否存在该对象对应的类型,查找成功才对该对象执行序列化操作。
b重载序列化函数,以类对象的引用作为其输入参数,通过输入参数显式的指明, 哪些类的对象是符合要求需要被序列化的。
方案a的优势在于其功能设计逻辑清晰。其不足在于序列化前需要预处理以记录 对象类型,序列化与反序列化过程都需要查表。
方案b则通过输入参数的匹配可以判断对象是否为满足要求的类型,省去了建表 和查表的过程。其不足在于重载序列化函数时,需要显式的指明其输入参数的类型,即在程 序设计时,要求人为的统计得出需要被序列化的对象的类型总集。
考虑到序列化机制运行效率,本发明设计时采用方案b,以程序设计阶段的低效 (人工统计比较繁琐)换取运行阶段的高效。
确定哪些类成员需要被序列化时,本发明同样设计了两套初始方案a利用列表存储类成员的序列化状态,表中包括类成员的ID编号,以及该成员是否需 要被序列化(用BOOL型数据表示)。在序列化时,首先对类成员统计得到列表,并保存,然后 对成员进行序列化;在反序列化时,则对应的首先读取此表,并根据此表的内容判断需要重 构哪些成员信息。此表也可演化为用二进制编码来表示,每一位所处的位置(从低位算起) 表示成员的ID号,该位的0,1状态表示对应的成员是否被序列化。如0101表明只有第1, 3个成员被序列化。需提供M位二进制编码才能满足需求(对上文得到的类型总集中的每 个类分析其成员个数,得出类成员个数的最大值为M)。
b假定默认所有成员都要被序列化,在序列化时,遇到不需要被序列化的成员时, 输出辅助字段(如Oxff)在序列化文件中“占位”,在反序列划时,读到此辅助字段,则说明对 应位置的成员未被序列化,对该成员赋默认值即可。
方案a更为完善,表或二进制编码集中记录了类成员的序列化状况,充当了成员 序列化引擎,即序列化和反序列化时可通过表或二进制编码跟踪类成员,并可给出统计信 息。方案b则将各个成员的序列化状况分散至序列化结果信息中,亦满足设计需求且实现 相对容易。这两种方案执行效率、资源占用率都很接近。本发明选择相对容易实现的方案 b。
序列化源文件文件名时,只保存顶层模型(实体)的源文件文件名。
如下伪代码所示,Al,…,An是packagej. mo中的顶层模型,Al中包含嵌套模型 B,映射至Dom体系则为Class* al,…,Class* an, al中包含成员变量b。al,…,an序 列化时,必须先序列化其源文件文件名package^, mo,b非顶层模型,则不要序列化其所处 的源文件信息(b的序列化参照规则1. 3)。
权利要求
1.一种物理建模语言Modelica的模型库文件序列化方法,其特征在于在第一次加载 模型库时,对Modelica模型库的源文件进行词法/语法分析,创建文档对象模型抽象语法 树,通过序列化技术将文档对象模型抽象语法树的数据保存至序列化结果文件。
2.根据权利要求1所述的物理建模语言Modelica的模型库文件序列化方法,其特征在 于所述通过序列化技术将文档对象模型抽象语法树的数据保存至序列化结果文件包括下 列步骤(1)根据文档对象模型抽象语法树中数据的数据类型,用预先定义的标志符标记所需 保存的数据;(2)根据Modelica文档对象模型类系图制定对象映射表;(3)根据对象映射表将所需序列化的数据进行分类标记,标记时需区分类、类成员以 及对象所在实体文件;(4)依据Modelica编译结果进行序列化输出,序列化依照对象数据排列规则进行,每 个Modelica对象数据输出前,首先输出其分类标记,其次为数据块大小,最后为数据内 容;当指定数据不存在时,以占位符进行数据虚拟填充。
3.—种物理建模语言Modelica的模型库文件的反序列化方法,其特征在于读取序列 化结果文件,包括如下步骤,(1)根据Modelica文档对象模型类系图制定的对象映射表预先创建所需反序列化的 对象,并进行对象初始化,初始对象数据为空;(2)从序列化文件中读入数据,根据读取的分类标记确定向何种对象填充数据,根据 读取的数据块大小值确定对象数据的大小,最终实现读入单个的完整对象,如果读入数据 为占位符,则该对象的指定数据设置为空;(3)依据Modelica模型序列化文件中的对象结果顺序依次在内存中创建新的对象, 对象的层次关系按照序列化文件中的分类标记进行组织,从而实现在内存中重构Modelica 模型编译结果。
全文摘要
本发明公开了一种物理建模语言Modelica的模型库文件序列化方法,其特征在于在第一次加载模型库时,对Modelica模型库的源文件进行词法/语法分析,创建文档对象模型抽象语法树,通过序列化技术将文档对象模型抽象语法树的数据保存至序列化结果文件。同时公开了相应的反序列化方法。本发明通过预处理过程,在第一次加载模型库时,生成序列化结果文件,因而在以后加载模型库时,只需要直接从读取结果文件即可,避免每次都模型库进行词法语法解析,大大加快了模型库的加载速度。以Modelica2.1标准库为例,未使用本发明的方法时,加载时间为300秒,使用本发明的方法后,加载时间仅为600毫秒。
文档编号G06F9/445GK102043657SQ20111003449
公开日2011年5月4日 申请日期2011年2月1日 优先权日2011年2月1日
发明者周凡利, 唐俊杰, 张和华, 田显钊, 郭俊峰, 陈立平 申请人:苏州同元软控信息技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1