在学习Flex的过程中,你可能会遇到Flex对象持久化方面的问题,这里和大家分享一下,很多人认为对象不能拷贝到服务器,其实浅度的拷贝是可以做到的。

成都创新互联主要从事做网站、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务沁县,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
关于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;
 - }
 
【编辑推荐】