关于 SCORM 2004 3rd Edition Sample Run-Time Environment 的二次开发(-)learner学习信息的提取

来源:互联网 发布:可以录音的软件 编辑:程序博客网 时间:2024/04/28 19:41

 上篇解决了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对象。方法如下:

    public static Properties covert(String s) {
        InputStream in 
= new ByteArrayInputStream(s.getBytes());
        Properties p 
= new Properties();
        
try {
            p.load(in);
        }
 catch (Exception e) {
            e.printStackTrace();
        }

        
return p;
    }

如果想省事的话。可以直接利用URLConnection来直接将Properties对象序列化到业务系统。由业务系统来提取他们所关心的数据。当然这样业务系统开发人员需要熟悉scorm 的Data Model了。。我在这里是写了一套Data Model类型提供各种数据信息的取出方法。自己在rte环境生成properties后又重新封装到data模型里再序列化到业务系统。这样业务系统开发会相对简单点。

在二次开发过程中业务系统和adl rte运行系统的交互是通过http来的大家可以用HttpClient或者URLConnection来交互。这样开发完毕后可以做到业务系统和scorm学习平台的相对独立。对于以后有需要scorm学习平台的项目可以直接移植二次开发过的scorm运行平台就OK。并不需要重新开发一套新的scorm平台。这只是我对于adl得rte平台二次开发的一些经验。时间比较紧。只是花了几天时间来做一个demo。甚至没来得及考察其他scorm学习平台。唉。官僚主义害死人啊。

原创粉丝点击