`
lixinye0123
  • 浏览: 332285 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

ActionScript 3 中的对象序列化

    博客分类:
  • Flex
阅读更多
    我们都知道对象序列化的目的是为了对象能够在网络上传输,以便存储对象,这是很有用处的,比如一个在线Flash游戏,玩家玩到一半想明天再玩,这时需要通过对象序列化把游戏数据保存起来,不然关闭浏览器数据就都没了,又要从头开始,当然利用Flash中的LSO也可以进行存储数据,不过是存在客户端上,这样的数据不一定能持久,对象序列化的主要目的是保存到服务器的数据库里,也许有人会问,干嘛不把对象的属性直接保存到数据库,还这么麻烦饶一大圈,这当然可以,但是如果对象的属性非常多,写起来会不会很繁琐呢,不如直接把对象保存起来这样反而跟简便,对象序列化的原理是把对象转换为字符串的形式,因为字符串任何语言都认识都能处理,而对象类型只能是属于特定的语言,比如一个Rectangle实例有width,height,fillColor,lineColor属性,把它转换为字符串格式后:"width=value|height=value|fillColor=value|lineColor=value"。
    ActionScript 3本身并没有提供对象序列化的APIs,因为它已经有了flash remoting(AMF协议),AMF协议完成对象的序列化和反序列化,这里我们先不谈AMF,看看如何自定义实现对象的序列化,OReilly.Essential.ActionScript.3.0的作者提供了一系列类和接口来实现对象序列化,我们看看他是如何做的:

定义了一个Serializable接口,只声明一个方法用于对象的序列化:
package serializer
...{
    
public interface Serializable
    
...{
        function serialize():String;
    }

}

定义一个实现Serializable接口的Serializer类,用于完成对象
package serializer
...{
    
public class Serializer implements Serializable
    
...{
        
private var serializationVars:Array; //存储对象的属性
        
private var serializationObj:Serializable; //指向可序列化的对象引用
        
private var recordSeparator:String; //指定属性之间的分隔符
        
        
public function Serializer()...{
            setSerializationObj(
this);
        }

        
public function setSerializationVars(vars:Array):void...{
            serializationVars 
= vars;
        }

        
public function setSerializationObj(obj:Serializable):void...{
            serializationObj 
= obj;
        }

        
public function setRecordSeparator(rs:String):void...{
            recordSeparator 
= rs;
        }

        
public function serialize():String
        
...{
            var s:String 
= "";
            
for (var i:int = serializationVars.length; -->= 0;)...{
                s 
+= serializationVars[i] + "=" + String(serializationObj[serializationVars[i]]);
                
if(i>0)...{
                    s 
+= recordSeparator;
                }

            }

            
return s;
        }

        
    }

}

一个继承Serializer的Point类,我们将对Point类实例进行序列化处理:
package serializer
...{
    
public class Point extends Serializer
    
...{
        
public var x:Number;
        
public var y:Number;
        
public var name:String = "Point";
        
        
public function Point(x:Number,y:Number)
        
...{
            
super();
            setRecordSeparator(
","); //设置分隔符
            setSerializationVars([
"x","y"]); //序列化x,y属性
            
this.x = x;
            
this.y = y;
        }

        
    }

}

测试类,输出结果为:y=6,x=5
package
...{
    
import flash.display.Sprite;
    
import serializer.Point;
    
import serializer.Rectangle;
    
import serializer.Rectangle;

    
public class TestSerialization extends Sprite
    
...{
        
public function TestSerialization()
        
...{
            
super();
            var p:Point 
= new Point(5,6);
            trace(p.serialize());     

        }

        
    }

}

我们看到已经成功把Point对象变成字符串“y=6,x=5”,我们再来看一个例子:

Shape类,定义了两个属性fillColor,lineColor:
package serializer
...{
    
public class Shape
    
...{
        
public var fillColor:uint = 0xFFFFFF;
        
public var lineColor:uint = 0;
        
        
public function Shape(fillColor:uint,lineColor:uint)...{
            
this.fillColor = fillColor;
            
this.lineColor = lineColor;
        }

    }

}

Rectangle类继承Shape,同时实现Serializable接口:
package serializer
...{
    
public class Rectangle extends Shape implements Serializable
    
...{
        
public var width:Number = 0;
        
public var height:Number = 0;
        
public function Rectangle(fillColor:uint, lineColor:uint)
        
...{
            
super(fillColor, lineColor);
        }

        
public function setSize(w:Number,h:Number):void...{
            width 
= w;
            height 
= h;
        }

        
public function getArea():Number...{
            
return width*height;
        }

        
public function serialize():String
        
...{
            var ser:Serializer 
= new Serializer();
            ser.setRecordSeparator(
"|");
            ser.setSerializationVars([
"height","width","fillColor","lineColor"]);
            ser.setSerializationObj(
this);
            
return ser.serialize();
        }

        
    }

}
 
一个类要想能够被序列化,要么实现Serializable接口,要么继承已经实现Serializable接口的类,因为Rectangle类的父类没有实现Serializable接口,所以Rectangle类必须实现Serializable接口,而上面那个Point类的父类已经实现Serializable接口,等于是间接实现了,我们看到Rectangle类的serialize()方法,把Serializer当作序列化工具,对Rectangle对象进行序列化处理,  对于核心类Serializer作者设计的比较巧妙,能同时处理两种情况的序列化。
    最后还是要说一下一个小问题,假如序列化后的字符串保存到数据库了,再读取进行反序列化时,该怎么知道这些字符串是什么类的呢??? 我的想法是在序列化时同时保存类名以便为反序列化做准备,拿Point例子来说:
增加一个属性代表类名:
package serializer
...{
    
public class Point extends Serializer
    
...{
http://images.csdn.net/syntaxh
分享到:
评论

相关推荐

    flex api 3.6 带序列化反序列化的标绘

    在Flex中,我们可以使用ActionScript 3.0的内置功能进行序列化和反序列化。例如,`flash.utils.ObjectOutput`和`flash.utils.ObjectInput`接口可用于将数据写入或读出二进制流。这对于持久化数据、跨域通信或者在...

    C#flash序列化案例

    在C#编程语言中,序列化是指将对象的状态转换为可以存储或传输的数据格式的过程,而反序列化则是相反的过程,即将数据恢复为原来的对象状态。在与Flash交互时,C#中的序列化技术扮演了关键角色,尤其是在开发跨平台...

    ActionScript3中的JSON编码解码包

    这个"ActionScript3中的JSON编码解码包"可能是一个库或框架,专门用于在AS3环境中处理JSON数据,实现数据的序列化和反序列化。 ActionScript3是Adobe Flash Platform的主要编程语言,常用于开发富互联网应用(RIA)...

    flex 3 programming actionscript 3

    Flex 3编程还包括服务端数据的交互,书中会介绍如何使用AMF(Action Message Format)进行数据序列化,以及如何连接到Web服务,如SOAP或RESTful API,实现数据的实时传输。同时,还会涉及状态管理,使应用能根据用户...

    flex序列化json

    3. **类型转换**: FlexJSON库还支持自定义类型转换,以便在序列化和反序列化过程中处理特定的ActionScript类。这可以通过实现`ITypeConverter`接口并注册到`TypeConverter`类中来完成。 4. **忽略属性**: 在某些...

    ActionScript3 设计模式+ 源码(打包下载)

    在AS3中,可用于创建复杂的UI组件或动画序列。 10. 适配器模式:将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。 11. 组合模式:将对象组合成树形结构以...

    protocol buffer已整合actionscript3输出

    在本项目中,"protocol buffer已整合actionscript3输出"意味着Protocol Buffer已经扩展了对ActionScript 3的支持,使得ActionScript 3开发者可以利用Protocol Buffer来处理数据序列化和反序列化的需求。 ...

    AMF3协议中文版定义.pdf

    3. 序列化和反序列化:AMF 3 提供了序列化和反序列化机制,允许对象图在不同的会话中被持久化和恢复。 4. 跨平台支持:AMF 3 支持多种平台,包括 Flash Player、Adobe AIR、Adobe Flex 等。 AMF 3 的应用场景包括:...

    ActionScript3 UML建模工具

    在AS3中,对象图可以帮助理解代码在运行时的状态,有助于调试和问题定位。 3. 用例图(Use Case Diagram):用例图描绘了系统与外部用户(或系统)之间的交互。在AS3中,这可以用来定义Flash应用的各种功能,如用户...

    flash actionscript3游戏开发教程小as3 demo 1个人投掷西瓜把另1个人砸死.zip

    首先,ActionScript3的引入是为了提升Flash内容的性能和结构化编程。与早期版本相比,AS3采用了更严格的类型系统和面向对象的编程模型,这使得代码更加高效且易于维护。在这个游戏中,我们可能会看到类的使用,如...

    flash actionscript3 as3 DesignPattern面向对象23种设计模式的实现源代码.zip

    在AS3中,可以使用序列化来实现状态的保存和恢复。 20. **观察者模式**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。AS3的事件模型完全符合这一...

    ActionScript开发技术大全

    8.2.3在FlexBuilder3中进行调试 155 8.3处理ActionScript3.0中的异常 160 8.3.1使用try…catch…finally语句 160 8.3.2throw语句主动抛出异常 162 8.3.3处理异常事件 163 8.4异常类型 163 8.4.1异常对象 164 8.4.2...

    Flex 对象持久化

    3. ByteArray类:在ActionScript 3.0中用于处理二进制数据,是实现对象序列化和反序列化的主要工具之一。它提供了writeObject()和readObject()等方法来执行这些操作。 4. 持久化存储介质:对象被序列化后可以存储在...

    聊天室ActionScript 3.0实现

    AS3提供了ObjectOutput和ObjectInput类,可以将对象转换为二进制数据流,方便在网络中传输,然后再在另一端进行反序列化恢复为原对象。 5. **用户界面设计**:聊天室的用户界面通常包含文本输入框(用于输入消息)...

    ActionScript3.0cookbook中文版

    书中的内容涵盖了ActionScript3.0的基础知识,如变量、函数、类的定义和使用,同时也深入到高级主题,如事件处理、显示对象的层次结构、时间线控制、网络通信、音频和视频处理、数据序列化等。 书中"cookbook"的...

    聊天室(ActionScript 3.0实现)

    5. **数据序列化与反序列化**:在客户端和服务器之间传输数据时,可能需要将对象转换为字符串(序列化)和从字符串还原对象(反序列化)。了解JSON格式和使用`flash.utils.ObjectProxy`、`flash.utils.ByteArray`等...

    AMF(ActionScript Message Format) 格式说明文档(v0)

    标记对象序列化的结束。 #### 严格数组类型(StrictArrayType) 与ECMA数组类似,但仅包含数值类型的键。 #### 日期类型(DateType) 日期类型在AMF0中由Unix时间戳和时区偏移量组成。 #### 长字符串类型...

    ActionScript+3.0+Cookbook+中文完整版

    3. **类与对象**:AS3中的类定义了对象的结构和行为,通过实例化类创建对象。类可以有构造函数、方法和属性。继承、封装和多态是面向对象编程的三大特性,在AS3中都有体现。 4. **事件驱动编程**:AS3采用事件驱动...

    聊天室(ActionScript 3.0)

    2. **数据传输格式**:通常,聊天室会采用JSON或XML等轻量级的数据交换格式,便于解析和序列化消息内容。ActionScript 3.0提供了内置的`JSON`和`XML`对象来处理这两种格式。 3. **事件驱动编程**:ActionScript 3.0...

Global site tag (gtag.js) - Google Analytics