AltSerialization.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. //
  2. // System.Web.Util.AltSerialization
  3. //
  4. // Author(s):
  5. // Gonzalo Paniagua Javier ([email protected])
  6. // Jackson Harper ([email protected])
  7. //
  8. // (C) 2003 Novell, Inc (http://www.novell.com)
  9. //
  10. using System;
  11. using System.IO;
  12. using System.Collections;
  13. using System.Runtime.Serialization.Formatters.Binary;
  14. namespace System.Web.Util {
  15. internal sealed class AltSerialization {
  16. private static ArrayList types;
  17. internal static readonly int NullIndex = 16;
  18. private AltSerialization () { }
  19. static AltSerialization ()
  20. {
  21. types = new ArrayList ();
  22. types.Add ("");
  23. types.Add (typeof (string));
  24. types.Add (typeof (int));
  25. types.Add (typeof (bool));
  26. types.Add (typeof (DateTime));
  27. types.Add (typeof (Decimal));
  28. types.Add (typeof (Byte));
  29. types.Add (typeof (Char));
  30. types.Add (typeof (Single));
  31. types.Add (typeof (Double));
  32. types.Add (typeof (short));
  33. types.Add (typeof (long));
  34. types.Add (typeof (ushort));
  35. types.Add (typeof (uint));
  36. types.Add (typeof (ulong));
  37. }
  38. internal static void SerializeByType (BinaryWriter w, object value)
  39. {
  40. Type type = value.GetType ();
  41. int i = types.IndexOf (type);
  42. if (i == -1) {
  43. w.Write (15); // types.Count
  44. BinaryFormatter bf = new BinaryFormatter ();
  45. bf.Serialize (w.BaseStream, value);
  46. return;
  47. }
  48. w.Write (i);
  49. switch (i) {
  50. case 1:
  51. w.Write ((string) value);
  52. break;
  53. case 2:
  54. w.Write ((int) value);
  55. break;
  56. case 3:
  57. w.Write ((bool) value);
  58. break;
  59. case 4:
  60. w.Write (((DateTime) value).Ticks);
  61. break;
  62. case 5:
  63. w.Write ((decimal) value);
  64. break;
  65. case 6:
  66. w.Write ((byte) value);
  67. break;
  68. case 7:
  69. w.Write ((char) value);
  70. break;
  71. case 8:
  72. w.Write ((float) value);
  73. break;
  74. case 9:
  75. w.Write ((double) value);
  76. break;
  77. case 10:
  78. w.Write ((short) value);
  79. break;
  80. case 11:
  81. w.Write ((long) value);
  82. break;
  83. case 12:
  84. w.Write ((ushort) value);
  85. break;
  86. case 13:
  87. w.Write ((uint) value);
  88. break;
  89. case 14:
  90. w.Write ((ulong) value);
  91. break;
  92. }
  93. }
  94. internal static object DeserializeFromIndex (int index, BinaryReader r)
  95. {
  96. if (index == 15){
  97. BinaryFormatter bf = new BinaryFormatter ();
  98. return bf.Deserialize (r.BaseStream);
  99. }
  100. object value = null;
  101. switch (index) {
  102. case 1:
  103. value = r.ReadString ();
  104. break;
  105. case 2:
  106. value = r.ReadInt32 ();
  107. break;
  108. case 3:
  109. value = r.ReadBoolean ();
  110. break;
  111. case 4:
  112. value = new DateTime (r.ReadInt64 ());
  113. break;
  114. case 5:
  115. value = r.ReadDecimal ();
  116. break;
  117. case 6:
  118. value = r.ReadByte ();
  119. break;
  120. case 7:
  121. value = r.ReadChar ();
  122. break;
  123. case 8:
  124. value = r.ReadSingle ();
  125. break;
  126. case 9:
  127. value = r.ReadDouble ();
  128. break;
  129. case 10:
  130. value = r.ReadInt16 ();
  131. break;
  132. case 11:
  133. value = r.ReadInt64 ();
  134. break;
  135. case 12:
  136. value = r.ReadUInt16 ();
  137. break;
  138. case 13:
  139. value = r.ReadUInt32 ();
  140. break;
  141. case 14:
  142. value = r.ReadUInt64 ();
  143. break;
  144. }
  145. return value;
  146. }
  147. }
  148. }