您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 第13讲:Flex中的共享对象
北风网项目培训第13讲:Flex中的共享对象讲师:风舞烟应用Flex+ASP.net技术构建大型网上书店电子商务交易平台全程实录为什么需要共享对象?Flex中的持久化数据ShareObject的特点如何使用ShareObject综合示例持久化数据所谓持久化数据,就是当用户来使用你的应用程序时,由你的本地或者网络应用程序来存储、访问数据,以及在多个会话中来提供容量来存贮状态信息。Flex中的持久化数据(ShareObject)通过使用ShareObject数据可以被存贮在用户的本地硬盘上。ShareObject的功能非常像浏览器的cookie。并能允许你的Flex应用程序去存储简单数据类型(例如String和Array)并能注册自定义的数据类型到文件系统中一个应用程序制定的位置,这个为遏制可以被多个会话访问。和浏览器的cookies不同的是,ShareObject由一个较大的文件大小限制(100k),并且可以通过动作脚本消息格式(AMF)来序列化。AMF是被用来序列化AS对象以及在服务端和客户端之间通过FlashRemoting技术来传输remoting对象的一种二进制文件格式。实际上ShareObject的行为有些像浏览器的cookies,ShareObjects常常被成为FlashCookies,它可以:维护本地持久化在FlashMediaServer服务器上存储共享数据。实时共享数据你可以使用ShareObject来存贮数据到用户的硬盘上并且在应用程序的当前会话或者以后的会话来获取这些数据。无论如何,一个ShareObject只能被创建它的应用程序所访问。另外,应用程序对ShareObject的访问被限制,只能运行于相同的域。一个应用程序不能访问定位到不同域的ShareObject。ActionScript3提共了两种类型的ShareObject:本地共享对象(LocalSharedObjects)类似于浏览器cookie,本地存贮对象适于用力维护和持久化多个会话中的数据。远端共享对象(RemoteShareObjects)远端共享对象需要使用FMS,它更像是实时的数据传输设备。当你想要在一个多人参与的聊天室中实时查看聊天记录时,你可以在这个聊天应用程序中使用远端共享对象。当一个远端共享对象在客户端的机器上被更新,它会回馈更新到服务器上的这个共享对象,并会影响和更新其他正在查看相同共享对象的机器上指定的共享对象。创建或者打开一个已经存在的本地共享对象,使用如下代码privatevarlocalShareObj:SharedObject=SharedObject.getLocal(mylso);静态方法getLocal返回一个客户端上的共享对象的引用。对于远端共享对象,使用如下代码:privatevarmyRemoteObj:SharedObject=SharedObject.getRemote(myRso);静态方法getRemote返回一个FMS上能被多个客户端访问到的共享对象引用说明:静态方法getRemote返回一个FMS上能被多个客户端访问到的共享对象引用。在调用了getLocal或者getRemote之后,例子会在客户端机器上使用一个*.sol连接来打开或者创建一个文件。至此,上面的例子会以两位个文件名作为结束myLso.sol和myRso.sol.SOL文件的默认位置依赖于正在运行的操作系统。这些位置对应不同的操作系统,如下所示:Windows95/98/ME/2000/XPC:/DocumentsandSettings/{用户域}/ApplicationData/Macromedia/FlashPlayer/#SharedObjects/{web域}/{应用程序路径}/{应用程序名}/object.sol默认情况,共享对象的最大文件大小是100kb你可以使用SharedObject类的data属性来添加数据到一个共享对象的SOL文件。这个是特殊的属性允许你持久化标准类型和非标准类型的数据。如://获取一个存在的共享对象;或者创建这个对象publicvarsoInstance:SharedObject=SharedObject.getLocal(myLso);//字串存贮publicvaroString:String=AdobeFlex4;soInstance.data.oPhrase=oString;//数组存贮publicvaroArrayItems:Array=[10,11,12];soInstance.data.oArrayNumbers=oArrayItems;//布尔值存贮publicvaroBoolean:Boolean=true;soInstance.data.oDecision=oBoolean;lso.flush();注意事项:1、试图直接指定共享对象的实例会引起一个编译类型错误://引发编译错误soInstance.variable=compileerror;2、当指定实例数据到data属性时,必须确保没有直接指定值,而是使用了一个变量//也会引发编译错误soInstance.data=compileerror;3、默认情况下,一个应用程序创建一个共享对象,在应用程序退出时会自动写SOL文件到文件系统,而不管共享对象指定的默认文件大小。在会话打开时,SharedObject.flush方法被用来将这些数据保存到SOL文件。SOL文件大小默认最大为100kb。你也可以使用flush方法的minDiskSpace参数来改变已经分配的文件大小。如:lso.flush(5000);最终用户可以使用AdobeFlash播放器浏览器插件的设置管理器来允许你的应用写文件到硬盘,以及分配SOL文件大小和访问。4、当flush方法被调用,它会尝试写数据到客户端电脑。flush调用的结果是如下三个可能之一:a.如果用户禁止对应域的本地共享对象(LSO)存贮,或者如果Flash播放器存贮数据因为相同原因失败,数据就不会被存贮并且flush方法会抛出一个错误b.如果保存本地共享对象所需要的磁盘空间小于对于对应域本地存贮设置的大小,数据会被写到磁盘上并且方法会返SharedObjectFlushStatus.FLUSHED,来标示方法成功运行。c.如果给flush方法赋予了可选参数最小磁盘空间,则已经被分配的磁盘空间必须大于或者等于这个数值,才能成功运行flush。d.如果共享对象的数据需要大于已分配空间的,则用户会被提示来允许足够的空间大小访问,用来存贮数据。当这个(对用户提示)发生时,会返回SharedObjectFlushStatus.PENDING.当用户允许了访问之后,超出的空间会自动被分配并且数据会被保存示例1(Demo1)ShardObject.getLocal()方法用来访问你的应用程序存贮在用户硬盘上的本地共享对象。如果调用了getLocal()方法的时候共享对象还不存在,默认会创建一个新的SOL文件,可以通过data属性来访问共享对象中预先存储的数据。示例2(Demo2):MXML代码:mx:VBoxwidth=100%height=100%mx:Buttonlabel=readasharedobjectclick={readSharedObject()}/mx:TextAreaid=statuswidth=100%height=100%//mx:VBox脚本:fx:Scriptprivatevarlso:SharedObject;privatefunctionreadSharedObject():void{varsampleData1:String=admin;lso=SharedObject.getLocal(mylso);if(lso.data.someData1==undefined){lso.data.someData1=sampleData1;lso.flush();status.text+=lso文件被赋值为:+lso.data.someData1+\n\n;}else{status.text+=读取的lso文件的内容:+lso.data.someData1+\n;}}/fx:Script1、要从磁盘上清除一个共享对象,可以用clear()方法来清除一个共享对象2、从一个共享对象中删除数据的一个指定位置。可以用delete关键字来移出一个共享对象的data属性中的制定数据示例(Demo3)MXML:mx:VBoxwidth=500height=200mx:Buttonlabel=删除共享对象click={removeSharedObject()}/mx:TextAreaid=statuswidth=50%height=300//mx:VBoxfx:Script![CDATA[privatevarlso:SharedObject;privatefunctionremoveSharedObject():void{varsampleData1:String=data1;varsampleData2:String=data2;//createanlsoobjectandassignsomedatatoitlso=SharedObject.getLocal(mylso);lso.data.someData1=sampleData1;lso.data.someData2=sampleData2;lso.flush();status.text=lso文件存储为:+\ndata1:+lso.data.someData1+\ndata2:+lso.data.someData2;//deleteapieceofdatafromthelsodeletelso.data.someData1;status.text+=\n\n现在删除lso.data.someData1后的数据为:+\ndata1:+lso.data.someData1+\ndata2:+lso.data.someData2;//removethelsocompletelyfromthefilesystemlso.clear();status.text+=\n\n现在调用clear()方法清除共享对象:+\ndata1:+lso.data.someData1+\ndata2:+lso.data.someData2;}]]问题我想要能去保存自定数据类型的对象到一个共享对象中。解决办法使用registerClassAlias()方法来注册类型化的对象到Flash运行时,然后存贮这个对象实例到一个共享对象。当存贮类型化数据到一个共享对象时,应确保已经在运行时注册了类型化对象,这样在特殊的情况发生时候你的应用程序才能确切地指导如何序列化和反序列化这个对象registerClassAlias(package.ClassType,ClassType);registerClassAlias方法需要2个参数。第一个参数:是目标对象的完整限定类名以字符串的形式,通常就是类的别名。第二个参数:是你想要注册到第一个参数所提供的类名的对象。示例(Demo4)packageModels{publicclassAutomobile{privatevar_make:String;publicfunctiongetmake():String{return_make;}publicfunctionsetmake(value:String):void{_make=value;}privatevar_model:String;publicfunctiongetmo
本文标题:第13讲:Flex中的共享对象
链接地址:https://www.777doc.com/doc-3962286 .html