在学习Flex的过程中,你可能会遇到Flex对象持久化方面的问题,这里和大家分享一下,很多人认为对象不能拷贝到服务器,其实浅度的拷贝是可以做到的。
关于Flex对象持久化
关于Flex对象序列化和持久化的问题,很多人认为对象不能拷贝到服务器,其实浅度的拷贝是可以做到的。
我们来看这样一个例子:
- viewplaincopytoclipboardprint?
- privatefunctiontest():void{
- varcanvas:Canvas=newCanvas();
- canvas.width=100;
- canvas.height=100;
- //保存到ByteArray
- varb:ByteArray=newByteArray();
- b.writeObject(canvas);
- //取出对象
- b.position=0;
- varo:Object=b.readObject();
- varc:Canvas=objectToInstance(o,Canvas)asCanvas;
- trace(c.width);
- trace(c.height);
- this.addChild(c);
- }
◆该例子省略了保存到服务器,和从服务器中取出的过程,只是简单保存了Flex对象,然后就立即拿出ByteArray中的对象。因为中间的ByteArray是不变的(也就是说到服务器端类型变为byte[],其中的内容也不会改变),故中间过程可以忽略。
***的结果为100和100,说明拿出的Flex对象的宽和高都保持住了。
那么在中间的过程加入服务器操作,道理也应如此:
- viewplaincopytoclipboardprint?
- privatefunctiontest():void{
- varcanvas:Canvas=newCanvas();
- canvas.width=100;
- canvas.height=100;
- //保存到ByteArray
- varb:ByteArray=newByteArray();
- b.writeObject(canvas);
- //保存到服务器
- remoteObject.Save(b);
- }
然后在服务器端:
- viewplaincopytoclipboardprint?
- publicvoidSave(ByteArrayba)
- {
- //可以保存到文件
- FileStreamfs=newFileStream(Path,FileMode.Createm,FileAccess.Write);
- fs.Write(ba.GetBuffer(),0,ba.GetBuffer().Length);
- fs.Close();
- //=====
- //或者保存到数据库
- newFlexObjectDAO().Save(ba.GetBuffer);
- }
◆这样,我们可以随时读取这个Flex对象,并处理,服务器端的读取程序我就不写了,只写Flex部分:
- viewplaincopytoclipboardprint?
- privatefunctiontest():void{
- //取出对象
- remoteObject.Load();
- }
- privatefunctionremoteObjectResult(event:ResultEvent):void{
- varb:ByteArray=eent.resultasByteArray;
- b.position=0;
- varo:Object=b.readObject();
- varc:Canvas=objectToInstance(o,Canvas)asCanvas;
- trace(c.width);
- trace(c.height);
- this.addChild(c);
- }
同理,也可以取出100和100。
objectToInstance方法的内容:
- viewplaincopytoclipboardprint?
- publicstaticfunctionobjectToInstance(object:Object,clazz:Class):*
- {
- varbytes:ByteArray=newByteArray();
- bytes.objectEncoding=ObjectEncoding.AMF0;
- varobjBytes:ByteArray=newByteArray();
- objBytes.objectEncoding=ObjectEncoding.AMF0;
- objBytes.writeObject(object);
- vartypeInfo:XML=describeType(clazz);
- varfullyQualifiedName:String=typeInfo.@name.toString().replace(/::/,".");
- registerClassAlias(fullyQualifiedName,clazz);
- varlen:int=fullyQualifiedName.length;
- bytes.writeByte(0x10);//0x10isAMF0for"typedobject(classinstance)"
- bytes.writeUTF(fullyQualifiedName);
- bytes.writeBytes(objBytes,1);
- bytes.position=0;
- varresult:*=bytes.readObject();
- returnresult;
- }
【编辑推荐】