序列化对象就像as3中的表单一样

时间:2010-11-08 05:00:00

标签: actionscript-3 serialization post

我希望通过HTTP传输post请求,正文需要包含我已经创建的ValueObject的信息。基本上我需要序列化对象(具有多个维度)。我遇到的问题是我不想将数据作为JSON或XML传输,而是作为多维数组传输。它适用于HTML表单,如:

数据:

Array
(
    [a] => Array
        (
            [a] => Array
                (
                    [1] =>  abcd
                )

            [b] => defg
        )

    [d] => ghij
)

请求正文(已解码):

a[a][1]=abcd&a[b]=defg&d=ghij

那里有没有可以进行这种序列化的库吗?我正在使用as3httpclientlib,所以我没有mx.rpc系列的便利。我花了几个小时试图推出自己的解决方案,但我很确定我会因为有人花更多时间和思考的解决方案而变得更好。

3 个答案:

答案 0 :(得分:0)

您可以尝试AMF来解决您的问题(根据您的编程语言,您有不同的库)。 主要优点是您可以将对象映射到对象(使用值对象)并保留数据类型(如数组)。

我正在使用插件amf和Symfony,以下是返回数据的示例:

SabreAMF_TypedObject对象 (     [amfClassName:private] =>产品

[amfData:private] => Array
    (
        [code] => 1970A007
        [designation] => 1970 PELL A007 BLANC
        [description] => Vernis extra souple extra brillant
        [sommeil] => 
        [name] => 1970
        [base] => A Stretch Enduit
        [composition] => 43% PL 57% PU
        [laize] => 137-140 cm
        [weight] => 588 g/ml
        [dechirure] => 10 daN/9 daN
        [abrasion] => 5000
        [xenotest] => 4/5
        [non_feu] => Non
        [Color] => SabreAMF_TypedObject Object
            (
                [amfClassName:private] => Color
                [amfData:private] => Array
                    (
                        [id] => 124
                        [name] => BLANC
                    )

            )

一些解释:

[amfClassName:private] => Product

输入我的对象。 As3方面我有一个产品价值对象,它包含数组属性,如“代码”,“指定”,“描述”,......和颜色(另一种带有值对象颜色的类型数组)

所以你可以轻松拥有一个多维结构数组......

答案 1 :(得分:0)

确定,

所以这里使用URLVariables更简单:

package {
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;

public class URLVariableExample extends Sprite {

    private static const URL_SERVER:String = "http://localhost/testURL.php";
    private var loader:URLLoader;

    public function URLVariableExample() {
        init();
    }

    private function init() : void {
        var request:URLRequest = new URLRequest(URL_SERVER);

        var urlVar:URLVariables = new URLVariables();
    var a : Array = ["toto", "titi", "loulou"];
        urlVar["urlTest[a][a]"] = a.toString();
        urlVar["urlTest[a][b]"] = "desc";
        urlVar["urlTest[d]"] = "defg";

        request.data = urlVar;
        request.method = URLRequestMethod.POST;

        loader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, loaderComplete);       
        loader.load(request);
    }

    private function loaderComplete(event : Event) : void {
        loader.removeEventListener(Event.COMPLETE, loaderComplete);
        trace(URLLoader(event.currentTarget).data);
    }
}

}

我请求了一个php文件,只是放了一个简单的var_dump函数。 跟踪返回:

array(2) {["d"]=>string(4) "defg"["a"]=> array(2) {["a"]=>string(16) "toto,titi,loulou["b"]=>string(4) "desc"}}

答案 2 :(得分:0)

var url:String = 'http://localhost/dump.php';
var params:Object = {
    test: 'ok',
    nested_1: {
        nested_2: {
            nested_3: {
                nested_4: {
                    hello: 'mf',
                    str: '~!@#$%^&*()_+'
                }
            }
        }
    },
};

var request:URLRequest = new URLRequest(url);
var variables:URLVariables = new URLVariables();

parameters = fixParameters(parameters || {});

for (var key:String in parameters) {
    variables[key] = parameters[key];
}

request.data = variables;

var loader:URLLoader = new URLLoader();
loader.load(request);

这里是fixParameters方法

private function fixParameters(data:Object, parameters:Object = null, prefixes:Array = null):Object {
    var setPrefix:Array;
    var prefixKey:String;

    if (!parameters) {
        parameters = {};
    }

    if (!prefixes) {
        prefixes = [];
    }

    for (var key:String in data) {
        setPrefix = prefixes.concat([key]);

        if (typeof(data[key]) == 'object') {
            parameters = fixParameters(data[key], parameters, setPrefix);
        } else {
            prefixKey = '';
            for (var i:Number = 0; i < setPrefix.length; i++) {
                prefixKey += i == 0 ? setPrefix[i] :  '[' + setPrefix[i] + ']';
            }
            parameters[prefixKey] = data[key];
        }
    }

    return parameters;
}