1 // 2 // System.Web.Util.AltSerialization 3 // 4 // Author(s): 5 // Gonzalo Paniagua Javier (gonzalo@ximian.com) 6 // Jackson Harper (jackson@ximian.com) 7 // 8 // (C) 2003 Novell, Inc (http://www.novell.com) 9 // 10 11 // 12 // Permission is hereby granted, free of charge, to any person obtaining 13 // a copy of this software and associated documentation files (the 14 // "Software"), to deal in the Software without restriction, including 15 // without limitation the rights to use, copy, modify, merge, publish, 16 // distribute, sublicense, and/or sell copies of the Software, and to 17 // permit persons to whom the Software is furnished to do so, subject to 18 // the following conditions: 19 // 20 // The above copyright notice and this permission notice shall be 21 // included in all copies or substantial portions of the Software. 22 // 23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30 // 31 32 using System; 33 using System.IO; 34 using System.Collections; 35 using System.Runtime.Serialization.Formatters.Binary; 36 37 namespace System.Web.Util { 38 39 internal sealed class AltSerialization 40 { AltSerialization()41 AltSerialization () { } 42 Serialize(BinaryWriter w, object value)43 internal static void Serialize (BinaryWriter w, object value) 44 { 45 TypeCode typeCode = value != null ? Type.GetTypeCode (value.GetType ()) : TypeCode.Empty; 46 w.Write ((byte)typeCode); 47 48 switch (typeCode) { 49 case TypeCode.Boolean: 50 w.Write ((bool) value); 51 break; 52 case TypeCode.Byte: 53 w.Write ((byte) value); 54 break; 55 case TypeCode.Char: 56 w.Write ((char) value); 57 break; 58 case TypeCode.DateTime: 59 w.Write (((DateTime) value).Ticks); 60 break; 61 case TypeCode.DBNull: 62 break; 63 case TypeCode.Decimal: 64 w.Write ((decimal) value); 65 break; 66 case TypeCode.Double: 67 w.Write ((double) value); 68 break; 69 case TypeCode.Empty: 70 break; 71 case TypeCode.Int16: 72 w.Write ((short) value); 73 break; 74 case TypeCode.Int32: 75 w.Write ((int) value); 76 break; 77 case TypeCode.Int64: 78 w.Write ((long) value); 79 break; 80 case TypeCode.Object: 81 BinaryFormatter bf = new BinaryFormatter (); 82 bf.Serialize (w.BaseStream, value); 83 break; 84 case TypeCode.SByte: 85 w.Write ((sbyte) value); 86 break; 87 case TypeCode.Single: 88 w.Write ((float) value); 89 break; 90 case TypeCode.String: 91 w.Write ((string) value); 92 break; 93 case TypeCode.UInt16: 94 w.Write ((ushort) value); 95 break; 96 case TypeCode.UInt32: 97 w.Write ((uint) value); 98 break; 99 case TypeCode.UInt64: 100 w.Write ((ulong) value); 101 break; 102 103 } 104 } 105 Deserialize(BinaryReader r)106 internal static object Deserialize (BinaryReader r) 107 { 108 TypeCode typeCode = (TypeCode)r.ReadByte(); 109 switch (typeCode) { 110 case TypeCode.Boolean: 111 return r.ReadBoolean (); 112 case TypeCode.Byte: 113 return r.ReadByte (); 114 case TypeCode.Char: 115 return r.ReadChar (); 116 case TypeCode.DateTime: 117 return new DateTime (r.ReadInt64 ()); 118 case TypeCode.DBNull: 119 return DBNull.Value; 120 case TypeCode.Decimal: 121 return r.ReadDecimal (); 122 case TypeCode.Double: 123 return r.ReadDouble (); 124 case TypeCode.Empty: 125 return null; 126 case TypeCode.Int16: 127 return r.ReadInt16 (); 128 case TypeCode.Int32: 129 return r.ReadInt32 (); 130 case TypeCode.Int64: 131 return r.ReadInt64 (); 132 case TypeCode.Object: 133 BinaryFormatter bf = new BinaryFormatter (); 134 return bf.Deserialize (r.BaseStream); 135 case TypeCode.SByte: 136 return r.ReadSByte (); 137 case TypeCode.Single: 138 return r.ReadSingle (); 139 case TypeCode.String: 140 return r.ReadString (); 141 case TypeCode.UInt16: 142 return r.ReadUInt16 (); 143 case TypeCode.UInt32: 144 return r.ReadUInt32 (); 145 case TypeCode.UInt64: 146 return r.ReadUInt64 (); 147 default: 148 throw new ArgumentOutOfRangeException ("TypeCode:" + typeCode); 149 } 150 } 151 } 152 } 153 154