📄 serializer.js
字号:
// Description: js.io.Serializer 实现类的串行化
// Author: Wan Changhua
// Version: 2004.02.09.01
_package("js.io");
_import("js.lang.Object");
_import("js.util.XMLBuilder");
_import("js.lang.IllegalArgumentException");
function js.io.Serializer() {}
var _p = js.io.Serializer._extends("js.lang.Object");
var _c = js.io.Serializer;
_c.serialize = function(_obj) {
var node = js.io.Serializer._serializeToNode(_obj);
if (node == null) return null;
return node.xml;
}
_c._serializeToNode = function(_obj) {
var _node = null;
var _type = typeof(_obj);
var _builder = js.util.XMLBuilder.getInstance();
switch(_type) {
case "undefined": _node = _builder.createElement("js:void"); break;
case "number" : _node = _builder.createElement("js:number", _obj); break;
case "string" : _node = _builder.createElement("js:string", _obj); break;
case "boolean" : _node = _builder.createElement("js:boolean", String(_obj).toLowerCase()); break;
case "function" : _node = _builder.createElement("js:function", _obj.toString()); break;
case "object" :
if (_obj == null) {
_node = _builder.createElement("js:null");
} else if (_obj instanceof Array) {
_node = _builder.createElement("js:array");
for (var i = 0; i < _obj.length; i++) {
var _cnode = js.io.Serializer._serializeToNode(_obj[i]);
_node.appendChild(_cnode);
}
} else {
_node = _builder.createElement("js:object");
if (_obj instanceof Date) {
_node.setAttribute("type", "Date");
_node.appendChild(_builder.createTextNode(_obj.getTime()));
} else if (_obj instanceof Error) {
_node.setAttribute("type", "Error");
_node.appendChild(_builder.createElement("number", _obj.number));
_node.appendChild(_builder.createElement("description", _obj.description));
} else if (_obj instanceof Enumerator) {
_node.setAttribute("type", "Enumerator"); //TODO
} else if (_obj instanceof ActiveXObject) {
_node.setAttribute("type", "ActiveXObject"); // 不可拷贝,只能引用
var _pointer = null;
if (typeof(_obj.uniqueID)!="undefined") {
_pointer = _obj.uniqueID;
} else {
_pointer = "obj_" + (new Date()).getTime() + Math.round(Math.random()*1000);
eval("window." + _pointer + "=_obj;");
}
_node.appendChild(_builder.createElement("pointer", _pointer));
} else if (_obj instanceof String) {
_node.setAttribute("type", "String");
_node.appendChild(_builder.createTextNode(_obj.toString()));
} else if (_obj instanceof Boolean) {
_node.setAttribute("type", "Boolean");
_node.appendChild(_builder.createTextNode(_obj.valueOf()));
} else if (_obj instanceof Number) {
_node.setAttribute("type", "Number");
_node.appendChild(_builder.createTextNode(_obj.valueOf()));
} else if (_obj instanceof RegExp) {
_node.setAttribute("type", "RegExp");
_node.appendChild(_builder.createTextNode(_obj.source));
} else if (_obj instanceof Object) {
if (_obj instanceof js.lang.Object)
_node.setAttribute("type", _obj.className);
else
_node.setAttribute("type", "Object");
for (p in _obj) {
var v = _obj[p];
if (typeof(v) == "function") continue;
var pnode = _builder.createElement("js:member", js.io.Serializer.serialize(v));
pnode.setAttribute("name", p);
_node.appendChild(pnode);
}
} else {
_node.setAttribute("type", "unknow");
}
}
break;
case "unknow" : ;//TODO
default : _node = _builder.createElement("js:unknow");
}
return _node;
};
_c.parse = function(_str) {
_str = _str.replace(/<js:/g, "<").replace(/<\/js:/g, "</");
var _node = js.util.XMLBuilder.getInstance().parseToElement(_str);
if (_node == null)
_throw(new js.lang.IllegalArgumentException(this.className + " parse Error:can not parse!"));
return js.io.Serializer._parseFromNode(_node);
}
_c._parseFromNode = function(_node) {
var _type = _node.tagName;
switch(_type) {
case "void" : return;
case "null" : return null;
case "number" : var v = Number.NaN; eval("v = " + _node.text + ";"); return v;
case "string" : return _node.text;
case "boolean" : var v = new Boolean(_node.text); return v.valueOf();
case "function" : return new Function(_node.text);
case "array" :
var nodes = _node.childNodes;
var a = new Array();
for (var i = 0; i < nodes.length; i++)
a[i] = js.io.Serializer._parseFromNode(nodes.item(i));
return a;
case "object" :
var _otype = _node.getAttribute("type");
if (_otype == "Date") {
return new Date(parseInt(_node.text, 10));
} else if (_otype == "Error") {
return new Error(
parseInt(_node.selectSingleNode("number").text),
_node.selectSingleNode("description").text
);
} else if (_otype == "Enumerator") {
return new Enumerator();
} else if (_otype == "ActiveXObject") {
eval("var _v = window."
+ _node.selectSingleNode("pointer").text
+ ";"
);
return _v;
} else if (_otype == "String") {
return new String(_node.text);
} else if (_otype == "Boolean") {
return new Boolean(_node.text);
} else if (_otype == "Number") {
return new Number(_node.text);
} else if (_otype == "RegExp") {
return new RegExp(_node.text);
} else if (_otype == "unknow") {
return new Object(); //TODO
} else {
var v = null;
if (_otype == "Object") v = new Object();
else v = Class.forName(_otype).newInstance();
var nodes = _node.selectNodes("member");
for (var i = 0; i < nodes.length; i++) {
var mnode = nodes.item(i);
var mname = mnode.getAttribute("name");
var mvalue = js.io.Serializer.parse(mnode.text);
if (typeof(mvalue) == "undefined") continue; //TODO
eval("v." + mname + " = mvalue;");
}
return v;
}
case "unknow" : ; //TODO
default :
_throw(new js.lang.IllegalArgumentException(this.className + " parse Error:未知数据类型!"));
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -