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;
}
}
}