Răsfoiți Sursa

added custom haXe serialization

Nicolas Cannasse 15 ani în urmă
părinte
comite
ce5dd9bacc
3 a modificat fișierele cu 29 adăugiri și 8 ștergeri
  1. 1 0
      doc/CHANGES.txt
  2. 17 8
      std/haxe/Serializer.hx
  3. 11 0
      std/haxe/Unserializer.hx

+ 1 - 0
doc/CHANGES.txt

@@ -46,6 +46,7 @@
 	php : removed eval() everywhere and simplified _hx_lambda
 	php : fixed return type for Std.string() with integers and floats
 	php : fixed php.Lib.rethrow
+	all : added custom haXe serialization
 
 2010-01-09: 2.05
 	js : added js.Scroll

+ 17 - 8
std/haxe/Serializer.hx

@@ -88,6 +88,7 @@ class Serializer {
 		x : exception
 		y : urlencoded string
 		z : zero
+		C : custom
 	*/
 
 	function serializeString( s : String ) {
@@ -278,14 +279,22 @@ class Serializer {
 				buf.add(chars);
 			default:
 				cache.pop();
-				buf.add("c");
-				serializeString(Type.getClassName(c));
-				cache.push(v);
-				#if flash9
-				serializeClassFields(v,c);
-				#else
-				serializeFields(v);
-				#end
+				if( v.hxSerialize != null ) {
+					buf.add("C");
+					serializeString(Type.getClassName(c));
+					cache.push(v);
+					v.hxSerialize(this);
+					buf.add("g");
+				} else {
+					buf.add("c");
+					serializeString(Type.getClassName(c));
+					cache.push(v);
+					#if flash9
+					serializeClassFields(v,c);
+					#else
+					serializeFields(v);
+					#end
+				}
 			}
 		case TObject:
 			if( useCache && serializeRef(v) )

+ 11 - 0
std/haxe/Unserializer.hx

@@ -337,6 +337,17 @@ class Unserializer {
 			pos += len;
 			cache.push(bytes);
 			return bytes;
+		case "C".code:
+	 		var name = unserialize();
+			var cl = resolver.resolveClass(name);
+			if( cl == null )
+				throw "Class not found " + name;
+			var o : Dynamic = Type.createEmptyInstance(cl);
+			cache.push(o);
+			o.hxUnserialize(this);
+			if( get(pos++) != "g".code )
+				throw "Invalid custom data";
+			return o;
  		default:
  		}
  		pos--;