`
zxyskycn
  • 浏览: 50869 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

PHP 序列化和反序列化 for ActionScript 3.0

阅读更多

Serializable.as

ActionScript代码
/**********************************************************\  
|                                                          |  
| The implementation of PHPRPC Protocol 3.0                |  
|                                                          |  
| Serializable.as                                          |  
|                                                          |  
| Release 3.0.0                                            |  
| Copyright (c) 2005-2007 by Team-PHPRPC                   |  
|                                                          |  
| WebSite:  http://www.phprpc.org/                         |  
|           http://www.phprpc.net/                         |  
|           http://www.phprpc.com/                         |  
|           http://sourceforge.net/projects/php-rpc/       |  
|                                                          |  
| Authors:  Ma Bingyao <andot@ujn.edu.cn>                  |  
|                                                          |  
| This file may be distributed and/or modified under the   |  
| terms of the GNU Lesser General Public License (LGPL)    |  
| version 3.0 as published by the Free Software Foundation |  
| and appearing in the included file LICENSE.              |  
|                                                          |  
\**********************************************************/   
   
/* Serializable interface for custom PHP serialize.  
 *  
 * Copyright (C) 2006-2007 Ma Bingyao <andot@ujn.edu.cn>  
 * Version: 3.0  
 * LastModified: Oct 23, 2007  
 * This library is free.  You can redistribute it and/or modify it.  
 */   
   
package org.phprpc.util{   
    import flash.utils.ByteArray;   
    public interface Serializable {   
        function serialize():ByteArray;   
        function unserialize(ss:ByteArray):void;   
    }   
}   
 

PHPSerializer.as

ActionScript代码
/**********************************************************\  
|                                                          |  
| The implementation of PHPRPC Protocol 3.0                |  
|                                                          |  
| PHPSerializer.as                                         |  
|                                                          |  
| Release 3.0.0                                            |  
| Copyright (c) 2005-2007 by Team-PHPRPC                   |  
|                                                          |  
| WebSite:  http://www.phprpc.org/                         |  
|           http://www.phprpc.net/                         |  
|           http://www.phprpc.com/                         |  
|           http://sourceforge.net/projects/php-rpc/       |  
|                                                          |  
| Authors:  Ma Bingyao <andot@ujn.edu.cn>                  |  
|                                                          |  
| This file may be distributed and/or modified under the   |  
| terms of the GNU Lesser General Public License (LGPL)    |  
| version 3.0 as published by the Free Software Foundation |  
| and appearing in the included file LICENSE.              |  
|                                                          |  
\**********************************************************/   
/* PHP serialize/unserialize library for ActionScript 3.0.  
 *  
 * Copyright (C) 2006-2007 Ma Bingyao <andot@ujn.edu.cn>  
 * Version: 3.0  
 * LastModified: Nov 6, 2007  
 * This library is free.  You can redistribute it and/or modify it.  
 */   
package org.phprpc.util {   
    import org.phprpc.util.Serializable;   
    import flash.utils.ByteArray;   
    import flash.utils.Dictionary;   
    import flash.utils.getQualifiedClassName;   
    import flash.utils.getDefinitionByName;   
    public class PHPSerializer {   
        private static function isInteger(s:String):Boolean {   
            var i:int;   
            var l:int = s.length;   
            if (l > 11) {   
                return false;   
            }   
            for (i = (s.charAt(0) == '-') ? 1 : 0; i < l; i++) {   
                switch (s.charAt(i)) {   
                case '0' :   
                case '1' :   
                case '2' :   
                case '3' :   
                case '4' :   
                case '5' :   
                case '6' :   
                case '7' :   
                case '8' :   
                case '9' :   
                    break;   
                default :   
                    return false;   
                }   
            }   
            var n:Number = Number(s);   
            return !(n < -2147483648 || n > 2147483647);   
        }   
        public static function getClassName(o:*):String {   
            var className:String = getQualifiedClassName(o);   
            return className.replace(/\./g, '_').replace(/\:\:/g, '_');   
        }   
        private static function getObjectOfClass(cn:Array, poslist:Array, i:uint, c:String):Object {   
            if (i < poslist.length) {   
                var pos:uint = poslist[i];   
                cn[pos] = c;   
                var obj:Object = getObjectOfClass(cn, poslist, i + 1, '.');   
                if (i + 1 < poslist.length) {   
                    if (obj == null) {   
                        obj = getObjectOfClass(cn, poslist, i + 1, '_');   
                    }   
                }   
                return obj;   
            }   
            var classname:String = cn.join('');   
            try {   
                return new (flash.utils.getDefinitionByName(classname) as Class);   
            }   
            catch (e:Error) { };   
            return null;   
        }   
        public static function createObjectOfClass(classname:String):Object {   
            try {   
                return new (flash.utils.getDefinitionByName(classname) as Class);   
            }   
            catch (e:Error) {}   
            var poslist:Array = [];   
            var pos:int = classname.indexOf("_");   
            while (pos > -1) {   
                poslist[poslist.length] = pos;   
                pos = classname.indexOf("_", pos + 1);   
            }   
            if (poslist.length > 0) {   
                var cn:Array = classname.split('');   
                var obj:Object = getObjectOfClass(cn, poslist, 0, '.');   
                if (obj == null) {   
                    obj = getObjectOfClass(cn, poslist, 0, '_');   
                }   
                if (obj != null) {   
                    return obj;   
                }   
            }   
            return {name:classname};   
        }   
        public static function serialize(o:Object):ByteArray {   
            var sb:ByteArray = new ByteArray();   
            var ht:Dictionary = new Dictionary();   
            var hv:uint = 1;   
            function _serializeNull():void {   
                sb.writeUTFBytes('N;');   
            }   
            function _serializeBoolean(b:Boolean):void {   
                sb.writeUTFBytes(b ? 'b:1;' : 'b:0;');   
            }   
            function _serializeInteger(i:int):void {   
                sb.writeUTFBytes('i:' + i + ';');   
            }   
            function _serializeDouble(d:Number):void {   
                var s:String;   
                if (isNaN(d)) {   
                    s = 'NAN';   
                }   
                else if (d == Number.POSITIVE_INFINITY) {   
                    s = 'INF';   
                }   
                else if (d == Number.NEGATIVE_INFINITY) {   
                    s = '-INF';   
                }   
                else {   
                    s = d.toString(10);   
                }   
                sb.writeUTFBytes('d:' + s + ';');   
            }   
            function _serializeByteArray(ba:ByteArray):void {   
                ba.position = 0;   
                sb.writeUTFBytes('s:' + ba.length + ':"');   
                sb.writeBytes(ba);   
                sb.writeUTFBytes('";');                
            }   
            function _serializeString(s:String):void {   
                var utf8:ByteArray = new ByteArray();   
                utf8.writeUTFBytes(s);   
                sb.writeUTFBytes('s:' + utf8.length + ':"');   
                sb.writeBytes(utf8);   
                sb.writeUTFBytes('";');   
            }   
            function _serializeDate(dt:Date):void {   
                sb.writeUTFBytes('O:11:"PHPRPC_Date":7:{');   
                sb.writeUTFBytes('s:4:"year";');   
                _serializeInteger(dt.getFullYear());   
                sb.writeUTFBytes('s:5:"month";');   
                _serializeInteger(dt.getMonth() + 1);   
                sb.writeUTFBytes('s:3:"day";');   
                _serializeInteger(dt.getDate());   
                sb.writeUTFBytes('s:4:"hour";');   
                _serializeInteger(dt.getHours());   
                sb.writeUTFBytes('s:6:"minute";');   
                _serializeInteger(dt.getMinutes());   
                sb.writeUTFBytes('s:6:"second";');   
                _serializeInteger(dt.getSeconds());   
                sb.writeUTFBytes('s:11:"millisecond";');   
                _serializeInteger(dt.getMilliseconds());   
                sb.writeUTFBytes('}');   
            }   
            function _serializeArray(a:Object):void {   
                var k:String;   
                var l:uint = 0;   
                for (k in a) l++;   
                sb.writeUTFBytes('a:' + l + ':{');   
                for (k in a) {   
                    if (typeof (a[k]) != 'function') {   
                        isInteger(k) ? _serializeInteger(k) : _serializeString(k);   
                        _serialize(a[k]);   
                    }   
                }   
                sb.writeUTFBytes('}');   
            }   
            function _serializeObject(o:Object, cn:String):void {   
                var c:Serializable = o as Serializable;   
                var cnb:ByteArray = new ByteArray();   
                cnb.writeUTFBytes(cn);   
                if (c == null) {   
                    sb.writeUTFBytes('O:' + cnb.length + ':"');   
                    sb.writeBytes(cnb);   
                    var k:String;   
                    var l:uint = 0;   
                    for (k in o) l++;   
                    sb.writeUTFBytes('":' + l + ':{');                     
                    for (k in o) {   
                        if (typeof(o[k]) != 'function') {   
                            _serializeString(k);   
                            _serialize(o[k]);   
                        }   
                    }   
                    sb.writeUTFBytes('}');   
                }   
                else {   
                    var data:ByteArray = c.serialize();   
                    sb.writeUTFBytes('C:' + cnb.length + ':"');   
                    sb.writeBytes(cnb);   
                    sb.writeUTFBytes('":' + data.length + ':{');   
                    sb.writeBytes(data);   
                    sb.writeUTFBytes('}');   
                }   
            }   
            function _serializePointRef(R:uint):void {   
                sb.writeUTFBytes('R:' + R + ';');   
            }   
            function _serializeRef(r:uint):void {   
                sb.writeUTFBytes('r:' + r + ';');   
            }   
            function _serialize(o:*):void {   
                if (typeof (o) == "undefined" || o == null || o.constructor == Function) {   
                    hv++;   
                    _serializeNull();   
                    return;   
                }   
                var className:String = getClassName(o);   
                switch (o.constructor) {   
                case Boolean :   
                    hv++;   
                    _serializeBoolean(o);   
                    break;   
                case Number :   
                    hv++;   
                    isInteger(o) ? _serializeInteger(o) : _serializeDouble(o);   
                    break;   
                case String :   
                    hv++;   
                    _serializeString(o);   
                    break;   
                case ByteArray :   
                    hv++;   
                    _serializeByteArray(o);   
                    break;   
                case Date :   
                    hv++;   
                    _serializeDate(o);   
                    break;   
                default :   
                    var r:int = ht[o];   
                    if (className == "Object" || o.constructor == Array) {   
                        if (r) {   
                            _serializePointRef(r);   
                        }   
                        else {   
                            ht[o] = hv++;   
                            _serializeArray(o);   
                        }   
                    }   
                    else {   
                        if (r) {   
                            hv++;   
                            _serializeRef(r);   
                        }   
                        else {   
                            ht[o] = hv++;   
                            _serializeObject(o, className);   
                        }                      
                    }   
                    break;   
                }   
            }   
            _serialize(o);   
            return sb;   
        }   
        public static function unserialize(sb:ByteArray):* {   
            var ht:Dictionary = new Dictionary();   
            var hv:int = 1;   
            function _readNumber():String {   
                var s:String = '';   
                var c:String = sb.readUTFBytes(1);   
                while ((c != ';') && (c != ':')) {   
                    s += c;   
                    c = sb.readUTFBytes(1);   
                }   
                return s;   
            }   
            function _unserializeNull():Object {   
                sb.position++;   
                return null;   
            }   
            function _unserializeBoolean():Boolean {   
                sb.position++;   
                var b:Boolean = (sb.readUTFBytes(1) == '1');   
                sb.position++;   
                return b;   
            }   
            function _unserializeInteger():int {   
                sb.readByte();   
                var i:int = parseInt(_readNumber());   
                return i;   
            }   
            function _unserializeDouble():Number {   
                sb.position++;   
                var d:Number;   
                var s:String = _readNumber();   
                switch (s) {   
                case 'NAN' :   
                    d = Number.NaN;   
                    break;   
                case 'INF' :   
                    d = Number.POSITIVE_INFINITY;   
                    break;   
                case '-INF' :   
                    d = Number.NEGATIVE_INFINITY;   
                    break;   
                default :   
                    d = parseFloat(s);   
                }   
                return d;   
            }   
            function _unserializeByteArray():ByteArray {   
                sb.position++;   
                var l:uint = parseInt(_readNumber());   
                sb.position++;   
                var ba:ByteArray = new ByteArray();   
                if (l > 0) {   
                    sb.readBytes(ba, 0, l);   
                }   
                sb.position += 2;   
                return ba;   
            }   
            function _unserializeString():String {   
                sb.position++;   
                var l:uint = parseInt(_readNumber());   
                sb.position++;   
                var s:String = sb.readUTFBytes(l);   
                sb.position += 2;   
                return s;   
            }   
            function _unserializeEscapedString(len:int):String {   
                sb.position++;   
                var l:uint = parseInt(_readNumber());   
                sb.position++;   
                var i:int;   
                var s:Array = new Array(l);   
                for (i = 0; i < l; i++) {   
                    if ((s[i] = sb.readUTFBytes(1)) == '\\') {   
                        s[i] = String.fromCharCode(parseInt(sb.readUTFBytes(len), 16));   
                    }   
                }   
                sb.position += 2;   
                return s.join('');   
            }   
            function _unserializeArray():Array {   
                sb.position++;   
                var n:int = parseInt(_readNumber());   
                sb.position++;   
                var i:int;   
                var k:*;   
                var a:Array = [];   
                ht[hv++] = a;   
                for (i = 0; i < n; i++) {   
                    switch (sb.readUTFBytes(1)) {   
                    case 'i' :   
                        k = _unserializeInteger();   
                        break;   
                    case 's' :   
                        k = _unserializeString();   
                        break;   
                    case 'S' :   
                        k = _unserializeEscapedString(2);   
                        break;   
                    case 'U' :   
                        k = _unserializeEscapedString(4);   
                        break;   
                    default :   
                        return null;   
                    }   
                    a[k] = _unserialize();   
                }   
                sb.position++;   
                return a;   
            }   
            function _unserializeDate(n:int):Date {   
                var i:int;   
                var k:String;   
                var a:Object = {};   
                for (i = 0; i < n; i++) {   
                    switch (sb.readUTFBytes(1)) {   
                    case 's' :   
                        k = _unserializeString();   
                        break;   
                    case 'S' :   
                        k = _unserializeEscapedString(2);   
                        break;   
                    case 'U' :   
                        k = _unserializeEscapedString(4);   
                        break;   
                    default :   
                        return null;   
                    }   
                    if (sb.readUTFBytes(1) == 'i') {   
                        a[k] = _unserializeInteger();   
                    }   
                    else {   
                        return null;   
                    }   
                }   
                sb.position++;   
                var dt:Date = new Date(a.year, a.month - 1, a.day, a.hour, a.minute, a.second, a.millisecond);   
                ht[hv++] = dt;   
                return dt;   
            }   
            function _unserializeObject():* {   
                sb.position++;   
                var l:uint = parseInt(_readNumber());   
                sb.position++;   
                var cn:String = sb.readUTFBytes(l);   
                sb.position += 2;   
                var n:uint = parseInt(_readNumber());   
                sb.position++;   
                if (cn == "PHPRPC_Date") {   
                    return _unserializeDate(n);   
                }   
                var i:int;   
                var k:String;   
                var o:Object = createObjectOfClass(cn);   
                ht[hv++] = o;   
                for (i = 0; i < n; i++) {   
                    switch (sb.readUTFBytes(1)) {   
                    case 's' :   
                        k = _unserializeString();   
                        break;   
                    case 'S' :   
                        k = _unserializeEscapedString(2);   
                        break;   
                    case 'U' :   
                        k = _unserializeEscapedString(4);   
                        break;   
                    default :   
                        return false;   
                    }   
                    if (k.charAt(0) == '\0') {   
                        k = k.substring(k.indexOf('\0', 1) + 1, k.length);   
                    }   
                    o[k] = _unserialize();   
                }   
                sb.position++;   
                return o;   
            }   
            function _unserializeCustomObject():* {   
                sb.position++;   
                sb.position++;   
                var l:uint = parseInt(_readNumber());   
                sb.position++;   
                var cn:String = sb.readUTFBytes(l);   
                sb.position += 2;   
                var n:uint = parseInt(_readNumber());   
                sb.position++;   
                var data:ByteArray = new ByteArray();   
                sb.readBytes(data, 0, n);   
                sb.position++;   
                var o:Object = createObjectOfClass(cn);   
                var c:Serializable = o as Serializable;   
                if (c == null) {   
                    o.data = data;   
                    return o;   
                }   
                c.unserialize(data);   
                return c;   
            }   
            function _unserializeRef():* {   
                sb.position++;   
                var r:uint = parseInt(_readNumber());   
                return ht[r];   
            }   
            function _unserialize():* {   
                var result:*;   
                switch (sb.readUTFBytes(1)) {   
                case 'N' :   
                    result = _unserializeNull();   
                    ht[hv] = result;   
                    hv++;   
                    return result;   
                case 'b' :   
                    result = _unserializeBoolean();   
                    ht[hv] = result;   
                    hv++;   
                    return result;   
                case 'i' :   
                    result = _unserializeInteger();   
                    ht[hv] = result;   
                    hv++;   
                    return result;   
                case 'd' :   
                    result = _unserializeDouble();   
                    ht[hv] = result;   
                    hv++;   
                    return result;   
                case 's' :   
                    result = _unserializeByteArray();   
                    ht[hv] = result;   
                    hv++;   
                    return result;   
                case 'S' :   
                    result = _unserializeEscapedString(2);   
                    ht[hv] = result;   
                    hv++;   
                    return result;   
                case 'U' :   
                    result = _unserializeEscapedString(4);   
                    ht[hv] = result;   
                    hv++;   
                    return result;   
                case 'r' :   
                    result = _unserializeRef();   
                    ht[hv] = result;   
                    hv++;   
                    return result;   
                case 'a' :   
                    return _unserializeArray();   
                case 'O' :   
                    return _unserializeObject();   
                case 'C' :   
                    return _unserializeCustomObject();   
                case 'R' :   
                    return _unserializeRef();   
                }   
                return false;   
            }   
            sb.position = 0;   
            return _unserialize();   
        }   
    }   
}   
 
分享到:
评论

相关推荐

    ActionScript3.0 对象序列化

    如果你需要获得ActionScript3.0对象序列化方面的代码样例,你应该下载该文档。

    ActionScript开发技术大全

    第7章ActionScript3.0中的日期和时间 139 7.1日期与时间 139 7.1.1创建日期对象 139 7.1.2日期对象的属性与方法 140 7.1.3日期格式化 143 7.2时间间隔 144 7.2.1使用Timer类 144 7.2.2秒表示例 146 7.3小结 149 第8...

    Hprose与.NET中各种序列化方式的对比

    Hprose (High Performance Remote Object Service Engine)是一款高性能跨语言跨平台的远程对象服务引擎,它支持众多语言和平台,包括主流的.NET、Java、PHP、Python、Ruby、JavaScript、ActionScript、Delphi、...

    awesome-actionscript:精​​选的ActionScript框架,库和软件的清单

    这些包括用于MD5和SHA 1哈希,图像编码器和JSON序列化的类,以及常规的String,Number和Date API。 -flixel是一个免费的Actionscript(Flash)库,我从过去几年中开发的各种Flash游戏(包括Gravity Hook,Fathom和...

    Hprose for php-PHP

    它提供了高效的序列化和反序列化库,并在此基础上提供了方便灵活的RPC引擎。 Hprose支持众多编程语言,例如: AAuto Quicker ActionScript ASP C++ Dart Delphi/Free Pascal dotNET(C#, Visual Basic...) Golang ...

    ByteArray.js:等效于ActionScript 3的ByteArray for Javascript,支持AMF0和AMF3

    它可以序列化和反序列化您的数据。 数据与ByteArray字节流共享,从而允许您通过调用ByteArray的构造函数来直接进行处理,这非常方便。 十进制值 该库还支持IEEE 754值,以防您需要使某些对象浮点数。 压缩和解压缩 ...

    nexuslib-as3:一个Actionscript库,提供强大的反射,序列化,种子随机数生成,加密,联网等功能

    枚举,随机,反射,序列化,加密,音频系统,HTTP请求。 反射库专门用于生产环境,目前正在生产环境中使用。 入门 下载,或在您的项目中克隆仓库和参考。 外部依赖 没有任何 blooddy-crypto与nexuslib.swc静态链接...

    as3-msgpack:MessagePack for ActionScript3 msgpack.org [ActionScript3]

    as3-msgpack v1.0.1 as3-msgpack是针对Actionscript3语言(Flash,Flex和AIR)的MessagePack规范的实现。 入门: : 下载最新版本: : 请参阅在线文档: : 检查愿望清单: : 关于消息包格式MessagePack是一种有效的...

    Modi:AS3 MVC 模型库,用于通过序列化和观察来定义应用程序数据

    模型定义存储为文本文件,易于阅读和维护。 使用简单的 Python 脚本,将数据转换为易于监控的 Actionscript 类。 要求 演示示例 演示/src/Player.yaml Player: name: String commanders: ManagedArray gold:...

    gudetama-tap-datamine:Gudetama Tap的数据挖掘脚本和信息! 移动应用

    有很多不同的对象类型(有关列表,请参见scripts/obj_ids.py ),每个对象都有自己的读/写功能,用于反序列化/序列化。 该代码全部用ActionScript3编写,可以使用ffdec进行反编译。 将反编译的源代码写入./...

    ash:Ash框架的Typescript端口-https:github.comrichardlordAsh-游戏开发的Actionscript 3实体框架

    引擎的序列化/反序列化。 -用于内部通信的信号。 [此软件包是必需的,并且由内核安装] -勾号提供者。 [推荐的] -用于Ash的可选工具。 发展历程 首次安装: $ npm i $ npm run build 一次测试: $ npm run ...

    circulate:RTMFP之上的API

    发送命令自动序列化/反序列化 创建自己的命令 允许轻松地以不同方式共享文件(p2p,直接流,DHT) 在组环中找到另一个用户 等等。 您可以使用Circulate 在不同客户端之间共享文件 同步不同的设备和/或屏幕 创建...

    Action Message Format -- AMF3 中文版.doc

    AMF(Action Message Format 动作信息格式)是用来序列化AS(ActionScript 动作脚本)实例对象(object graphs)的压缩的二进制格式。序列化的AMF编码的实例对象可用来持久化,并且在不同的会话中获得应用的公共状态,或者...

    Flex 对象持久化

    总有人问我关于Flex对象序列化和持久化的问题,很多人认为对象不能拷贝到服务器,其实浅度的拷贝是可以做到的。

    Cabron - PHP Flash Connector (Remoting)-开源

    用于远程处理PHP和ActionScript代码-它允许从Flash电影中远程调用PHP方法。 无需PHP扩展。 多语言支持,定时反序列化。 需要PHP 4.0.5或更高!

    amf_socket:Actionscript (Flash) 的双向 RPC 库。 高性能网络通信的简易按钮!

    高性能和低延迟是通过使用持久性 TCP/IP 套接字和 Flash 的本机序列化格式 (AMF) 实现的。 由于使用 AMF,您可以通过网络发送原语、散列、数组,甚至您的自定义类。 AMF Socket 试图通过隐藏尽可能多的细节来成为 ...

    java开源包1

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包11

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包2

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包3

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

Global site tag (gtag.js) - Google Analytics