关于 SCORM 2004 3rd Edition Sample Run-Time Environment 的二次开发(-)learner学习信息的提取
2008-01-13 20:01
826 查看
上篇解决了rte的跨平台。下面解决下如何提取出来业务系统关心的learner学习的状态信息
因为公司的另外一个项目的某些功能需要分析用户在scorm平台学习的情况。而adl都是将这些状态保存在文件里。所以我们就需要把这些数据提取出来。在研究rte的源码的过程中。并没有发现rte预留的有给开发人员的提取learner学习状态的接口。不知道是本人水平有限没有发现还是怎么样。但是时间紧迫。既然没有发现。那只好自己修改源码了。
scorm的Data Model被adl rte封装在org.adl.datamodels包里边。可以发现rte运行环境里边的单元element都继承了抽象类org.adl.datamodels.DMElement。因为我们不同的业务系统关心得数据可能不一样。所以我们能做的是把rte运行环境里的一切SCO交互数据都提取出来交给业务系统。当然其中cmi的数据是主要的。通过对源码的分析。认定可以通过toString方法来提取所有data Model。所以重写DMElement,SCORM_2004_DM。。。等类的toString方法。取出你所关心的数据。我这里是用键值对来提取表示的。(注意:rte里边的序列化对象并没有添加serialVersionUID,如果你修改了序列化的对象的源码。在对这些对象反序列化的时候会报错的。例如:
java.io.InvalidClassException: Serial.Serial1; local class incompatible: stream classdesc serialVersionUID = 762508508425139227, local class serialVersionUID = 1187169935661445676
解决这个问题可以在修改的对象里加入private static final long serialVersionUID=(stream classdesc serialVersionUID),至于序列化向上兼容和向下兼容的问题可以google一下。这里就不讨论了。)
这样可以在rte的运行环境中当adl持久化SCODataManager的时候把learner学习sco状态信息以键值对的形式取出来。或者在adl持久化后给业务系统发送消息。让业务系统反序列化化SCODataManager对象文件利用toString生成字符串。然后再将String形式的键值对生成Properties对象。方法如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
public static Properties covert(String s) ...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
InputStream in = new ByteArrayInputStream(s.getBytes());
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Properties p = new Properties();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
try ...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
p.load(in);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
} catch (Exception e) ...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
e.printStackTrace();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return p;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
如果想省事的话。可以直接利用URLConnection来直接将Properties对象序列化到业务系统。由业务系统来提取他们所关心的数据。当然这样业务系统开发人员需要熟悉scorm 的Data Model了。。我在这里是写了一套Data Model类型提供各种数据信息的取出方法。自己在rte环境生成properties后又重新封装到data模型里再序列化到业务系统。这样业务系统开发会相对简单点。
在二次开发过程中业务系统和adl rte运行系统的交互是通过http来的大家可以用HttpClient或者URLConnection来交互。这样开发完毕后可以做到业务系统和scorm学习平台的相对独立。对于以后有需要scorm学习平台的项目可以直接移植二次开发过的scorm运行平台就OK。并不需要重新开发一套新的scorm平台。这只是我对于adl得rte平台二次开发的一些经验。时间比较紧。只是花了几天时间来做一个demo。甚至没来得及考察其他scorm学习平台。唉。官僚主义害死人啊。
因为公司的另外一个项目的某些功能需要分析用户在scorm平台学习的情况。而adl都是将这些状态保存在文件里。所以我们就需要把这些数据提取出来。在研究rte的源码的过程中。并没有发现rte预留的有给开发人员的提取learner学习状态的接口。不知道是本人水平有限没有发现还是怎么样。但是时间紧迫。既然没有发现。那只好自己修改源码了。
scorm的Data Model被adl rte封装在org.adl.datamodels包里边。可以发现rte运行环境里边的单元element都继承了抽象类org.adl.datamodels.DMElement。因为我们不同的业务系统关心得数据可能不一样。所以我们能做的是把rte运行环境里的一切SCO交互数据都提取出来交给业务系统。当然其中cmi的数据是主要的。通过对源码的分析。认定可以通过toString方法来提取所有data Model。所以重写DMElement,SCORM_2004_DM。。。等类的toString方法。取出你所关心的数据。我这里是用键值对来提取表示的。(注意:rte里边的序列化对象并没有添加serialVersionUID,如果你修改了序列化的对象的源码。在对这些对象反序列化的时候会报错的。例如:
java.io.InvalidClassException: Serial.Serial1; local class incompatible: stream classdesc serialVersionUID = 762508508425139227, local class serialVersionUID = 1187169935661445676
解决这个问题可以在修改的对象里加入private static final long serialVersionUID=(stream classdesc serialVersionUID),至于序列化向上兼容和向下兼容的问题可以google一下。这里就不讨论了。)
这样可以在rte的运行环境中当adl持久化SCODataManager的时候把learner学习sco状态信息以键值对的形式取出来。或者在adl持久化后给业务系统发送消息。让业务系统反序列化化SCODataManager对象文件利用toString生成字符串。然后再将String形式的键值对生成Properties对象。方法如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
public static Properties covert(String s) ...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
InputStream in = new ByteArrayInputStream(s.getBytes());
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Properties p = new Properties();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
try ...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
p.load(in);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
} catch (Exception e) ...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
e.printStackTrace();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return p;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
如果想省事的话。可以直接利用URLConnection来直接将Properties对象序列化到业务系统。由业务系统来提取他们所关心的数据。当然这样业务系统开发人员需要熟悉scorm 的Data Model了。。我在这里是写了一套Data Model类型提供各种数据信息的取出方法。自己在rte环境生成properties后又重新封装到data模型里再序列化到业务系统。这样业务系统开发会相对简单点。
在二次开发过程中业务系统和adl rte运行系统的交互是通过http来的大家可以用HttpClient或者URLConnection来交互。这样开发完毕后可以做到业务系统和scorm学习平台的相对独立。对于以后有需要scorm学习平台的项目可以直接移植二次开发过的scorm运行平台就OK。并不需要重新开发一套新的scorm平台。这只是我对于adl得rte平台二次开发的一些经验。时间比较紧。只是花了几天时间来做一个demo。甚至没来得及考察其他scorm学习平台。唉。官僚主义害死人啊。
相关文章推荐
- 关于 SCORM 2004 3rd Edition Sample Run-Time Environment 的二次开发(-)跨平台解决方案
- 关于Revit 二次开发学习书籍
- solidworks二次开发学习(4)关于SelectByID2
- 收集一些关于Visio二次开发经典的文章,共同学习
- 收集一些关于Visio二次开发经典的文章,共同学习
- Python分布式爬虫前菜(2):关于提取网页源码中特定信息的技巧
- Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
- 学习Swift之(一):关于swift与开发环境配置
- MS SQL中关于拼接后数据列的信息提取
- 关于基于sharepoint开发信息发布系统的功能规划
- 关于系统中添加的音视频聊天的二次开发包SDK
- 【R语言学习笔记】关于提取各类模型值的意外发现
- AutoCAD二次开发之.net API学习笔…
- 根据时间提取介于某个时间段的信息 分类: python基础学习 2013-08-16 17:26 311人阅读 评论(0) 收藏
- 关于二次开发
- Kinect开发学习笔记之(七)骨骼数据的提取
- 一步一步学习Swift之(一):关于swift与开发环境配置
- 关于ASP.NET开发中session丢失的解决办法(学习笔试)
- AE 组件二次开发 :关于地图控件上ICommand
- 微软解决方案框架 - MSF的团队模型、MSF的开发模型,关于SA系统分析师信息的一篇好帖子