例子:
sample.as
import base.util.Serialization;
var s:Serialization = new Serialization();
var ary = new Array();
for(var i=0;i<10;i++){
ary.push(i);
}
var obj:Object = new Object();
obj["key1"] = "hello";
obj["key2"] = true;
obj["key3"] = 9999;
obj["key4"] = ary;
s.seriate(obj);//序列化
var strSaveXML : String = s.toString();
trace(strSaveXML);
//... ...
//... ...
var obj2:Object = s.deseriate(new XML(strSaveXML));//反序列化
trace(obj2);
源代码:
/****************************************
*
* Class : Serialization
* 序列化和反序列化
* Author:杨国清
*使用和转载请保留本段注释
* Mail:woderoom@hotmail.com
* Date:2005/05/19
* Ver:1.0.0.0
*
****************************************/
class base.util.Serialization extends Object {
public static var version : String = "1.0.0.0";
public static var className : String = "Serialization";
private var _doc : XML;
private var _data;
//
//Constructor
public function Serialization() {
_doc = new XML();
}
/**
* 对象序列化方法
* @param v 对象(Object/Array/Number/Boolean/String)
* @return 无
*/
public function seriate(v) : Void {
_doc = new XML();
_doc.xmlDecl = "<?xml version=/"1.0/" encoding=/"UTF-8/"?>";
_data = undefined;
var rootNode = new XMLNode(1,"root");
appendData(rootNode,"",v);
_doc.appendChild(rootNode);
}
/**
* 对象反序列化方法
* @param doc 序列化后的XML文档
* @return 无
*/
public function deseriate(doc:XML) : Void {
_doc = doc;
_doc.ignoreWhite = true;
_data = appendValue(_data,_doc.firstChild.firstChild);
}
/**
* toString
* @param 无
* @return String
*/
public function toString() : String {
return (_doc.toString());
}
/**
* toValue
* @param 无
* @return AnyType
*/
public function toValue() {
return (_data);
}
/**
* getType
* @param 无
* @return Number
*/
public function getType() : Number {
if(_doc != undefined) {
var rootNode : XMLNode = _doc.firstChild.firstChild;
if(rootNode != undefined) {
var t = rootNode.attributes["type"];
return (Number(t));
} else {
return (-1);
}
} else {
return (-1);
}
}
/**
* getTypeName
* @param 无
* @return String
*/
public function getTypeName() : String {
switch(getType()) {
case 0:
return "object";
break;
case 1:
return "array";
break;
case 2:
return "string";
break;
case 3:
return "number";
break;
case 4:
return "boolean";
break;
default:
return (null);
break;
}
}
private function appendData(r:XMLNode,k:String,v) : XMLNode {
var node : XMLNode;
switch(getDataType(v)){
case 0:
//Object
node = parseValue2Node(k,v,0);
for(var k2 in v){
node = appendData(node,k2,v[k2]);
}
break;
case 1:
//Array
node = parseValue2Node(k,v,1);
for(var i=0;i<v.length;i++){
node = appendData(node,String(i),v[i]);
}
break;
case 2:
//String
node = parseValue2Node(k,v,2);
break;
case 3:
//Number
node = parseValue2Node(k,v,3);
break;
case 4:
//Boolean
node = parseValue2Node(k,v,4);
break;
case 11:
//undefined or null
node = parseValue2Node(k,"",11);
break;
default:
return (r);
break;
}
r.appendChild(node);
return (r);
}
private function parseValue2Node(k,v,t) : XMLNode {
var node : XMLNode = new XMLNode(1,"node");
node.attributes["type"] = t;
node.attributes["key"] = repNull(k);
switch(t){
case 2:
//String
var nodeText : XMLNode = new XMLNode(3,v);
node.appendChild(nodeText);
break;
case 3:
//Number
var nodeText : XMLNode = new XMLNode(3,String(v));
node.appendChild(nodeText);
break;
case 4:
//Boolean
var nodeText : XMLNode;
if(v) {
nodeText = new XMLNode(3,"1");
} else {
nodeText = new XMLNode(3,"0");
}
node.appendChild(nodeText);
break;
}
return (node);
}
/**
* appendValue
* @param sd : source data
* @param an : append xml node
*/
private function appendValue(sd,an:XMLNode) {
var anType : Number = Number(an.attributes["type"]);
var anKey : String = an.attributes["key"];
var anChildLen : Number = an.childNodes.length;
var tmpData = parseNode2Value(an);
if(anType == 0 || anType == 1) {
for(var i=0;i<anChildLen;i++){
tmpData = appendValue(tmpData,an.childNodes[i]);
}
}
switch(getDataType(sd)) {
case 0:
//Object
sd[anKey] = tmpData;
break;
case 1:
//Array
sd[Number(anKey)] = tmpData;
break;
case 11:
sd = tmpData;
break;
}
return (sd);
}
private function parseNode2Value(n:XMLNode) {
var iType = Number(n.attributes["type"]);
switch(iType) {
case 0:
//Object
return (new Object());
break;
case 1:
//Array
var iLen : Number = n.childNodes.length;
return (new Array(iLen));
break;
case 2:
//String
if(n.hasChildNodes()){
return (n.firstChild.nodeValue);
} else {
return ("");
}
break;
case 3:
//Number
return (Number(n.firstChild.nodeValue));
break;
case 4:
//Boolean
if(n.firstChild.nodeValue == "1"){
return (true);
} else {
return (false);
}
break;
case 11:
//undefined or null
return (null);
break;
default:
return (null);
break;
}
}
private function getDataType(o) : Number {
if(o == undefined || o == null) {
return (11); //undefined or null
} else {
switch(typeof(o)){
case "object":
if(o instanceof Array){
return (1); //Array
} else {
return (0); //Object
}
break;
case "string":
return (2); //String
break;
case "number":
return (3); //Number
break;
case "boolean":
return (4); //Boolean
break;
default:
return (-1);//MovieClip or function
break;
}
}
}
private function repNull(s) : String {
if(s == undefined || s == null) {
return "";
} else {
return s;
}
}
}