|
|
@@ -38,155 +38,126 @@ namespace System.Web.Util {
|
|
|
|
|
|
internal sealed class 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
|
|
|
- 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);
|
|
|
- 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
|
|
|
if (r.BaseStream is java.io.ObjectInput)
|
|
|
return ((java.io.ObjectInput) r.BaseStream).readObject ();
|
|
|
#endif
|
|
|
BinaryFormatter bf = new BinaryFormatter ();
|
|
|
return bf.Deserialize (r.BaseStream);
|
|
|
+ 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);
|
|
|
}
|
|
|
-
|
|
|
- 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;
|
|
|
- }
|
|
|
-
|
|
|
- return value;
|
|
|
}
|
|
|
}
|
|
|
}
|