⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serializer.js

📁 JSVM核心类库,收集了JAVA进行JSVM开发必用技术进行归纳,在实际项目应用中直接引用相关类库即可现实JSVM相关功能!
💻 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 + -