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

📄 serializer.jsc

📁 《JavaScript王者归来》examples.rar
💻 JSC
字号:
# language: JSVM2

/**
 * @fileoverview js.io.Serializer class {@link http://jsvm.org/}
 * @file		Serializer.jsc
 * @author	Wan Changhua * @version	2.01, 10/23/05 * @since		JSVM1.0
 */

package js.io;

import js.lang.JObject;
import js.io.IOException;
import js.net.XmlDom;
import js.util.HashMap;

/** * Create a new Serializer instance.
 * Inherit from JObject
 * @author	Wan Changhua * @version	2.01, 10/23/05 * @extends js.lang.JObject * @class js.io.Serializer is a utility class for serialize
 * @constructor * @final
 * @deprecated */
class Serializer()
{

	var objectMap = new js.util.HashMap();
	var sequence = 0;
	var __this = this;
	
	/**
	 * a tool object for transform
	 * @private
	 * @type Object
	 */
	var trsfmer = new function ()
	{
	
		var xmldom = js.net.XmlDom.create();
		xmldom.setAsync(false);
		xmldom.loadXML("<ROOT/>");
	
		this.createElement = function(name, text)
		{
			var node = xmldom.createElement(name);
			if (typeof(text) != "undefined")
			{
				node.appendChild(xmldom.createTextNode(String(text)));
			}
			return node;
		}
		
		this.createTextNode = function(text)
		{
			return xmldom.createTextNode(String(text));
		}
	
		this.transformXMLToElement = function(xml)
		{
			return xmldom.utility.parseNode(xml);
		}
		
		this.getText = function (node)
		{
			return xmldom.utility.getText(node);
		}
		this.getXML = function (node)
		{
			return xmldom.utility.getXML(node);
		}
		
		this.destroy = function ()
		{
			xmldom.destroy();
			xmldom = null;
		}
	
	}

	var serializeToNode = function (obj)
	{
		var node = null;
		var type = typeof(obj);
		switch (type)
		{
			case "undefined"	:	node = trsfmer.createElement("void"); break;
			case "number"	: node = trsfmer.createElement("number", obj); break;
			case "string"	: node = trsfmer.createElement("string", obj); break;
			case "boolean"	: node = trsfmer.createElement("boolean", String(obj).toLowerCase()); break;
			case "function"	: node = trsfmer.createElement("function", obj.toString()); break;
			case "object"	:
				if (obj == null) {
					node = trsfmer.createElement("null");
				} else if (obj instanceof Array) {
					node = trsfmer.createElement("array");
					for (var i = 0; i < obj.length; i++) {
						var _cnode = serializeToNode(obj[i]);
						node.appendChild(_cnode);
					}
				} else {
					node = trsfmer.createElement("object");
					if (obj instanceof Date) {
						node.setAttribute("type", "Date");
						node.appendChild(trsfmer.createTextNode(obj.getTime()));
					} else if (obj instanceof Error) {
						node.setAttribute("type", "Error");
						node.appendChild(trsfmer.createElement("number", obj.number));
						node.appendChild(trsfmer.createElement("description", obj.description));
					} else if (obj instanceof String) {
						node.setAttribute("type", "String");
						node.appendChild(trsfmer.createTextNode(obj.toString()));
					} else if (obj instanceof Boolean) {
						node.setAttribute("type", "Boolean");
						node.appendChild(trsfmer.createTextNode(obj.valueOf()));
					} else if (obj instanceof Number) {
						node.setAttribute("type", "Number");
						node.appendChild(trsfmer.createTextNode(obj.valueOf()));
					} else if (obj instanceof RegExp) {
						node.setAttribute("type", "RegExp");
						node.appendChild(trsfmer.createTextNode(obj.source));
					} else if (obj instanceof Object) {
						var isJO = (obj instanceof JObject);
						node.setAttribute("type", 
							(isJO ? obj.getClass().getName() : "Object"));
						var oid = objectMap.get(obj);
						if (oid != null) {
							node.setAttribute("ref", oid);
							break;
						} else {
							oid = sequence++ ;
							objectMap.put(obj, oid);
							node.setAttribute("oid", oid);
						}
						for (var p in obj) {
							var v = obj[p];
							if ((isJO && p == "window") ||
								typeof(v) == "function") continue;
							var pnode = trsfmer.createElement("member",
								__this._serialize(v));
							pnode.setAttribute("name", p);
							node.appendChild(pnode);
						}
					} else {
						node.setAttribute("type", "unknow");
					}
				}
				break;
			case "unknow"	:
			default		: node = trsfmer.createElement("unknow");
		}
		return node;
	}

	var unserializeFromNode = function(node)
	{
		var type = node.tagName;
		switch (type) {
			case "void"	: return void(0);
			case "null"	: return null;
			case "number"	: return isNaN(trsfmer.getText(node)) ? Number.NaN : eval(trsfmer.getText(node));
			case "string"	: return trsfmer.getText(node);
			case "boolean"	: return (trsfmer.getText(node) == "true");
			case "function"	: return new Function(trsfmer.getText(node));
			case "array"	:
				var nodes = node.childNodes, l = nodes.length, arr = [];
				for (var i = 0; i < l; i++) {
					arr[i] = unserializeFromNode(nodes[i]);
				}
				return arr;
			case "object"	:
				var otype = node.getAttribute("type");
				if (otype == "Date") {
					return new Date(parseInt(trsfmer.getText(node), 10));
				} else if (otype == "Error") {
					return new Exception(
						parseInt(trsfmer.getText(node.selectSingleNode("number"))),
						trsfmer.getText(node.selectSingleNode("description"))
					);
				} else if (otype == "String") {
					return new String(trsfmer.getText(node));
				} else if (otype == "Boolean") {
					return new Boolean(trsfmer.getText(node) == "true");
				} else if (otype == "Number") {
					return new Number(trsfmer.getText(node));
				} else if (otype == "RegExp") {
					return new RegExp(trsfmer.getText(node));
				} else if (otype == "unknow") {
					return null; //TODO
				} else {
					var ref = node.getAttribute("ref");
					if (ref != null && ref != "") {
						return objectMap.get(ref);
					}
					var obj = (otype == "Object") ? {}
						: Class.forName(otype).newInstance();
					var oid = node.getAttribute("oid");
					objectMap.put(oid, obj);
					var cnodes = node.selectNodes("member");
					for (var i = 0; i < cnodes.length; i++) {
						var cnode = cnodes[i];
						var name = cnode.getAttribute("name");
						var value = __this._unserialize(trsfmer.getText(cnode));
						if (typeof(value) != "undefined")	{
							obj[name] = value;
						}
					}
					return obj;
				}
			case "unknow"	:
			default		:
				throw new IOException(Serializer.getName()
					+ ".unserializeFromNode() error: "
						+ "unknow data type [" + type + "]");
		}
	}

	/**	 * serialize an object to string
	 * @private
	 * @param {Object} obj an object to be serialized.	 * @return a string
	 * @type String	 */
	this._serialize = function(obj)
	{
		var node;
		return (null == (node = serializeToNode(obj))) ?
			null : XmlDom.utility.getXML(node);
	}

	/**	 * unserialize a string to object
	 * @private
	 * @param {String} str a string to be unserialized.	 * @return an object
	 * @type Object	 */
	this._unserialize = function(str)
	{
		var node = trsfmer.transformXMLToElement(str);
		if (node != null)
		{
				return unserializeFromNode(node);
		}
		throw new IOException(Serializer.getName()
			+ ": _unserialize() error; dataformat error.");
	}
	
	this.destroy = function()
	{
		trsfmer.destroy();
	}

}


/** * serialize an object to string
 * @param {Object} obj an object to be serialized. * @return the result of serialized object
 * @type String */
Serializer.serialize = function(obj)
{
	var serializer = new Serializer();
	var str = serializer._serialize(obj);
	serializer.destroy();
	return str;
}

/** * unserialize a string to object
 * @param {String} str a string * @return an object
 * @type Object */
Serializer.unserialize = function(str)
{
	var serializer = new Serializer();
	var obj = serializer._unserialize(str);
	serializer.destroy();
	return obj;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -