學習筆記 解析Flex對象持久化問題
在學習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;
- }
【編輯推薦】