2008-11-18 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.Util / AltSerialization.cs
index a36237a93b32b02aa23450b17b413ed2e915e3b3..bb873e6b42232ffe6e0d391927fde10485cec36e 100644 (file)
@@ -36,155 +36,127 @@ using System.Runtime.Serialization.Formatters.Binary;
 
 namespace System.Web.Util {
 
-       internal sealed class AltSerialization {
+       internal sealed class AltSerialization 
+       {
+               AltSerialization () { }
 
-                private static ArrayList types;
-
-                internal static readonly int NullIndex = 16;
-                
-               private AltSerialization () { }
-                
-                
-                static AltSerialization ()
-                {
-                        types = new ArrayList ();
-                        types.Add ("");
-                        types.Add (typeof (string));
-                        types.Add (typeof (int));
-                        types.Add (typeof (bool));
-                        types.Add (typeof (DateTime));
-                        types.Add (typeof (Decimal));
-                        types.Add (typeof (Byte));
-                        types.Add (typeof (Char));
-                        types.Add (typeof (Single));
-                        types.Add (typeof (Double));
-                        types.Add (typeof (short));
-                        types.Add (typeof (long));
-                        types.Add (typeof (ushort));
-                        types.Add (typeof (uint));
-                        types.Add (typeof (ulong));
-                }
-                
-               internal static void SerializeByType (BinaryWriter w, object value)
+               internal static void Serialize (BinaryWriter w, object value)
                {
-                       Type type = value.GetType ();
-                       int i = types.IndexOf (type);
-                       if (i == -1) {
-                               w.Write (15); // types.Count
-#if TARGET_J2EE
-                               ((System.Web.J2EE.ObjectOutputStream)w.BaseStream).NativeStream.writeObject(value);
-#else
-                               BinaryFormatter bf = new BinaryFormatter ();
-                               bf.Serialize (w.BaseStream, value);
-#endif
-                               return;
-                       }
-                       
-                       w.Write (i);
-                       switch (i) {
-                       case 1:
-                               w.Write ((string) value);
-                               break;
-                       case 2:
-                               w.Write ((int) value);
-                               break;
-                       case 3:
+                       TypeCode typeCode = value != null ? Type.GetTypeCode (value.GetType ()) : TypeCode.Empty;
+                       w.Write ((byte)typeCode);
+
+                       switch (typeCode) {
+                       case TypeCode.Boolean:
                                w.Write ((bool) value);
                                break;
-                       case 4:
-                               w.Write (((DateTime) value).Ticks);
-                               break;
-                       case 5:
-                               w.Write ((decimal) value);
-                               break;
-                       case 6:
+                       case TypeCode.Byte:
                                w.Write ((byte) value);
                                break;
-                       case 7:
+                       case TypeCode.Char:
                                w.Write ((char) value);
                                break;
-                       case 8:
-                               w.Write ((float) value);
+                       case TypeCode.DateTime:
+                               w.Write (((DateTime) value).Ticks);
+                               break;
+                       case TypeCode.DBNull:
+                               break;
+                       case TypeCode.Decimal:
+                               w.Write ((decimal) value);
                                break;
-                       case 9:
+                       case TypeCode.Double:
                                w.Write ((double) value);
                                break;
-                       case 10:
+                       case TypeCode.Empty:
+                               break;
+                       case TypeCode.Int16:
                                w.Write ((short) value);
                                break;
-                       case 11:
+                       case TypeCode.Int32:
+                               w.Write ((int) value);
+                               break;
+                       case TypeCode.Int64:
                                w.Write ((long) value);
                                break;
-                       case 12:
+                       case TypeCode.Object:
+#if TARGET_J2EE
+                               if (w.BaseStream is java.io.ObjectOutput) {
+                                       ((java.io.ObjectOutput) w.BaseStream).writeObject (value);
+                                       return;
+                               }
+#endif
+                               BinaryFormatter bf = new BinaryFormatter ();
+                               bf.Serialize (w.BaseStream, value);
+                               break;
+                       case TypeCode.SByte:
+                               w.Write ((sbyte) value);
+                               break;
+                       case TypeCode.Single:
+                               w.Write ((float) value);
+                               break;
+                       case TypeCode.String:
+                               w.Write ((string) value);
+                               break;
+                       case TypeCode.UInt16:
                                w.Write ((ushort) value);
                                break;
-                       case 13:
+                       case TypeCode.UInt32:
                                w.Write ((uint) value);
                                break;
-                       case 14:
+                       case TypeCode.UInt64:
                                w.Write ((ulong) value);
                                break;
+
                        }
                }
 
-               internal static object DeserializeFromIndex (int index, BinaryReader r)
+               internal static object Deserialize (BinaryReader r)
                {
-                       if (index == 15){
+                       TypeCode typeCode = (TypeCode)r.ReadByte();
+                       switch (typeCode) {
+                       case TypeCode.Boolean:
+                               return r.ReadBoolean ();
+                       case TypeCode.Byte:
+                               return r.ReadByte ();
+                       case TypeCode.Char:
+                               return r.ReadChar ();
+                       case TypeCode.DateTime:
+                               return new DateTime (r.ReadInt64 ());
+                       case TypeCode.DBNull:
+                               return DBNull.Value;
+                       case TypeCode.Decimal:
+                               return r.ReadDecimal ();
+                       case TypeCode.Double:
+                               return r.ReadDouble ();
+                       case TypeCode.Empty:
+                               return null;
+                       case TypeCode.Int16:
+                               return r.ReadInt16 ();
+                       case TypeCode.Int32:
+                               return r.ReadInt32 ();
+                       case TypeCode.Int64:
+                               return r.ReadInt64 ();
+                       case TypeCode.Object:
 #if TARGET_J2EE
-                               return ((System.Web.J2EE.ObjectInputStream)r.BaseStream).NativeStream.readObject();
-#else
+                               if (r.BaseStream is java.io.ObjectInput)
+                                       return ((java.io.ObjectInput) r.BaseStream).readObject ();
+#endif
                                BinaryFormatter bf = new BinaryFormatter ();
                                return bf.Deserialize (r.BaseStream);
-#endif
-                       }
-                       
-                       object value = null;
-                       switch (index) {
-                       case 1:
-                               value = r.ReadString ();
-                               break;
-                       case 2:
-                               value = r.ReadInt32 ();
-                               break;
-                       case 3:
-                               value = r.ReadBoolean ();
-                               break;
-                       case 4:
-                               value = new DateTime (r.ReadInt64 ());
-                               break;
-                       case 5:
-                               value = r.ReadDecimal ();
-                               break;
-                       case 6:
-                               value = r.ReadByte ();
-                               break;
-                       case 7:
-                               value = r.ReadChar ();
-                               break;
-                       case 8:
-                               value = r.ReadSingle ();
-                               break;
-                       case 9:
-                               value = r.ReadDouble ();
-                               break;
-                       case 10:
-                               value = r.ReadInt16 ();
-                               break;
-                       case 11:
-                               value = r.ReadInt64 ();
-                               break;
-                       case 12:
-                               value = r.ReadUInt16 ();
-                               break;
-                       case 13:
-                               value = r.ReadUInt32 ();
-                               break;
-                       case 14:
-                               value = r.ReadUInt64 ();
-                               break;
+                       case TypeCode.SByte:
+                               return r.ReadSByte ();
+                       case TypeCode.Single:
+                               return r.ReadSingle ();
+                       case TypeCode.String:
+                               return r.ReadString ();
+                       case TypeCode.UInt16:
+                               return r.ReadUInt16 ();
+                       case TypeCode.UInt32:
+                               return r.ReadUInt32 ();
+                       case TypeCode.UInt64:
+                               return r.ReadUInt64 ();
+                       default:
+                               throw new ArgumentOutOfRangeException ("TypeCode:" + typeCode);
                        }
-                       
-                       return value;
                }
        }
 }