您的位置:首页 > 移动开发 > Objective-C

[原创]FlashActionScript序列化和反序列化的实现(第一版)

2005-06-03 15:36 495 查看
例子:
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;
  }
 }
 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息