學(xué)習(xí)筆記 解析Flex對(duì)象持久化問(wèn)題
在學(xué)習(xí)Flex的過(guò)程中,你可能會(huì)遇到Flex對(duì)象持久化方面的問(wèn)題,這里和大家分享一下,很多人認(rèn)為對(duì)象不能拷貝到服務(wù)器,其實(shí)淺度的拷貝是可以做到的。
關(guān)于Flex對(duì)象持久化
關(guān)于Flex對(duì)象序列化和持久化的問(wèn)題,很多人認(rèn)為對(duì)象不能拷貝到服務(wù)器,其實(shí)淺度的拷貝是可以做到的。
我們來(lái)看這樣一個(gè)例子:
- viewplaincopytoclipboardprint?
- privatefunctiontest():void{
- varcanvas:Canvas=newCanvas();
- canvas.width=100;
- canvas.height=100;
- //保存到ByteArray
- varb:ByteArray=newByteArray();
- b.writeObject(canvas);
- //取出對(duì)象
- b.position=0;
- varo:Object=b.readObject();
- varc:Canvas=objectToInstance(o,Canvas)asCanvas;
- trace(c.width);
- trace(c.height);
- this.addChild(c);
- }
◆該例子省略了保存到服務(wù)器,和從服務(wù)器中取出的過(guò)程,只是簡(jiǎn)單保存了Flex對(duì)象,然后就立即拿出ByteArray中的對(duì)象。因?yàn)橹虚g的ByteArray是不變的(也就是說(shuō)到服務(wù)器端類(lèi)型變?yōu)閎yte[],其中的內(nèi)容也不會(huì)改變),故中間過(guò)程可以忽略。
***的結(jié)果為100和100,說(shuō)明拿出的Flex對(duì)象的寬和高都保持住了。
那么在中間的過(guò)程加入服務(wù)器操作,道理也應(yīng)如此:
- viewplaincopytoclipboardprint?
- privatefunctiontest():void{
- varcanvas:Canvas=newCanvas();
- canvas.width=100;
- canvas.height=100;
- //保存到ByteArray
- varb:ByteArray=newByteArray();
- b.writeObject(canvas);
- //保存到服務(wù)器
- remoteObject.Save(b);
- }
然后在服務(wù)器端:
- viewplaincopytoclipboardprint?
- publicvoidSave(ByteArrayba)
- {
- //可以保存到文件
- FileStreamfs=newFileStream(Path,FileMode.Createm,FileAccess.Write);
- fs.Write(ba.GetBuffer(),0,ba.GetBuffer().Length);
- fs.Close();
- //=====
- //或者保存到數(shù)據(jù)庫(kù)
- newFlexObjectDAO().Save(ba.GetBuffer);
- }
◆這樣,我們可以隨時(shí)讀取這個(gè)Flex對(duì)象,并處理,服務(wù)器端的讀取程序我就不寫(xiě)了,只寫(xiě)Flex部分:
- viewplaincopytoclipboardprint?
- privatefunctiontest():void{
- //取出對(duì)象
- 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方法的內(nèi)容:
- 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;
- }
【編輯推薦】
- 實(shí)例解析Flex字體的使用
- FlexBuilder4十大新特性閃亮登場(chǎng)
- 學(xué)習(xí)總結(jié) 在Flex中如何嵌入Flex字體
- 揭開(kāi)Flex正則表達(dá)式的神秘面紗
- FlexBuilder開(kāi)發(fā)方法及特點(diǎn)解析