关于Flex对象持久化的问题

     总有人问我关于Flex对象序列化和持久化的问题,很多人认为对象不能拷贝到服务器,其实浅度的拷贝是可以做到的。

 

     我们来看这样一个例子:

 

    private function test() : void { var canvas :Canvas = new Canvas(); canvas.width = 100; canvas.height = 100; // 保存到ByteArray var b : ByteArray = new ByteArray(); b.writeObject(canvas); // 取出对象 b.position = 0; var o : Object = b.readObject(); var c : Canvas = objectToInstance(o,Canvas) as Canvas; trace(c.width); trace(c.height); this.addChild(c); } 

 

    该例子省略了保存到服务器,和从服务器中取出的过程,只是简单保存了对象,然后就立即拿出ByteArray中的对象。因为中间的ByteArray是不变的(也就是说到服务器端类型变为byte[],其中的内容也不会改变),故中间过程可以忽略。

 

    最后的结果为100和100,说明拿出的对象的宽和高都保持住了。

 

    那么在中间的过程加入服务器操作,道理也应如此:

 

    private function test() : void { var canvas :Canvas = new Canvas(); canvas.width = 100; canvas.height = 100; // 保存到ByteArray var b : ByteArray = new ByteArray(); b.writeObject(canvas); // 保存到服务器 remoteObject.Save(b); }

 

   然后在服务器端:

 

    public void Save(ByteArray ba) { // 可以保存到文件 FileStream fs = new FileStream(Path,FileMode.Createm,FileAccess.Write); fs.Write(ba.GetBuffer(), 0, ba.GetBuffer().Length); fs.Close(); // ===== // 或者保存到数据库 new FlexObjectDAO().Save(ba.GetBuffer); }

 

   这样,我们可以随时读取这个对象,并处理,

   服务器端的读取程序我就不写了,只写flex部分:

   private function test() : void { // 取出对象 remoteObject.Load(); } private function remoteObjectResult(event : ResultEvent) : void { var b : ByteArray = eent.result as ByteArray; b.position = 0; var o : Object = b.readObject(); var c : Canvas = objectToInstance(o,Canvas) as Canvas; trace(c.width); trace(c.height); this.addChild(c); }

 

   同理,也可以取出100和100

 

   objectToInstance方法的内容:

 

   public static function objectToInstance( object:Object, clazz:Class ):* { var bytes:ByteArray = new ByteArray(); bytes.objectEncoding = ObjectEncoding.AMF0; var objBytes:ByteArray = new ByteArray(); objBytes.objectEncoding = ObjectEncoding.AMF0; objBytes.writeObject( object ); var typeInfo:XML = describeType( clazz ); var fullyQualifiedName:String = typeInfo.@name.toString().replace( /::/, "." ); registerClassAlias( fullyQualifiedName, clazz ); var len:int = fullyQualifiedName.length; bytes.writeByte( 0x10 ); // 0x10 is AMF0 for "typed object (class instance)" bytes.writeUTF( fullyQualifiedName ); bytes.writeBytes( objBytes, 1 ); bytes.position = 0; var result:* = bytes.readObject(); return result; }

 

   关于objectToInstance方法的解释,请参考《AS3 类型强转类

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值