【IT168技术资讯】关于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);
}
然后在服务器端:
view plaincopy to clipboardprint?
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方法的内容:
view plaincopy to clipboardprint?
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;
}