BDB.Serializer.Deserialize C# (CSharp) Метод

Deserialize() публичный Метод

public Deserialize ( byte data ) : object
data byte
Результат object
		public object Deserialize(byte[] data) {
			MemoryStream stream = new MemoryStream(data);
			BinaryReader reader = new BinaryReader(stream);
			
			TypeCode typecode = (TypeCode)stream.ReadByte();
			
			switch (typecode) {
				case TypeCode.Boolean: return reader.ReadBoolean ();
				case TypeCode.Byte: return reader.ReadByte ();
				case TypeCode.Char: return reader.ReadChar ();
				case TypeCode.DateTime:  return new DateTime(reader.ReadInt64 ());
				case TypeCode.Decimal: return reader.ReadDecimal ();
				case TypeCode.Double: return reader.ReadDouble ();
				case TypeCode.Int16: return reader.ReadInt16 ();
				case TypeCode.Int32: return reader.ReadInt32 ();
				case TypeCode.Int64: return reader.ReadInt64 ();
				case TypeCode.SByte: return reader.ReadSByte ();
				case TypeCode.Single: return reader.ReadSingle ();
				case TypeCode.UInt16: return reader.ReadUInt16 ();
				case TypeCode.UInt32: return reader.ReadUInt32 ();
				case TypeCode.UInt64: return reader.ReadUInt64 ();
				case TypeCode.String: return reader.ReadString ();
				default: // TypeCode.Object
					byte objtype = (byte)stream.ReadByte();
					if (objtype == 0) {
						int length = reader.ReadInt32();
						TypeCode innertype = (TypeCode)reader.ReadByte();
						object obj;
						switch (typecode) {
							case TypeCode.Boolean: obj = new Boolean[length]; break;
							case TypeCode.Byte: obj = new Byte[length]; break;
							case TypeCode.Char: obj = new Char[length]; break;
							case TypeCode.DateTime:  obj = new DateTime[length]; break;
							case TypeCode.Decimal: obj = new Decimal[length]; break;
							case TypeCode.Double: obj = new Double[length]; break;
							case TypeCode.Int16: obj = new Int16[length]; break;
							case TypeCode.Int32: obj = new Int32[length]; break;
							case TypeCode.Int64: obj = new Int64[length]; break;
							case TypeCode.SByte: obj = new SByte[length]; break;
							case TypeCode.Single: obj = new Single[length]; break;
							case TypeCode.UInt16: obj = new UInt16[length]; break;
							case TypeCode.UInt32: obj = new UInt32[length]; break;
							case TypeCode.UInt64: obj = new UInt64[length]; break;
							case TypeCode.String: obj = new String[length]; break;
							default: throw new InvalidOperationException();
						}
						for (int i = 0; i < length; i++) {
							switch (innertype) {
								case TypeCode.Boolean: (((bool[])obj)[i]) = reader.ReadBoolean(); break;
								case TypeCode.Byte: (((byte[])obj)[i]) = reader.ReadByte(); break;
								case TypeCode.Char: (((char[])obj)[i]) = reader.ReadChar(); break;
								case TypeCode.DateTime: (((DateTime[])obj)[i]) = new DateTime(reader.ReadInt32()); break;
								case TypeCode.Decimal: (((decimal[])obj)[i]) = reader.ReadDecimal(); break;
								case TypeCode.Double: (((double[])obj)[i]) = reader.ReadDouble(); break;
								case TypeCode.Int16: (((short[])obj)[i]) = reader.ReadInt16(); break;
								case TypeCode.Int32: (((int[])obj)[i]) = reader.ReadInt32(); break;
								case TypeCode.Int64: (((long[])obj)[i]) = reader.ReadInt64(); break;
								case TypeCode.SByte: (((sbyte[])obj)[i]) = reader.ReadSByte(); break;
								case TypeCode.Single: (((float[])obj)[i]) = reader.ReadSingle(); break;
								case TypeCode.UInt16: (((ushort[])obj)[i]) = reader.ReadUInt16(); break;
								case TypeCode.UInt32: (((uint[])obj)[i]) = reader.ReadUInt32(); break;
								case TypeCode.UInt64: (((ulong[])obj)[i]) = reader.ReadUInt64(); break;
								case TypeCode.String: (((string[])obj)[i]) = reader.ReadString(); break;
							}
						}
						return obj;
					} else if (objtype == 1) {
						return binfmt.Deserialize(stream);
					} else {
						throw new InvalidOperationException();
					}
			}
		}
	}

Usage Example

Пример #1
0
			public object GetObject(Serializer binfmt, DataType datatype) {
				if (Size == 0) return null;
	        	if (datatype == DataType.UInt) {
					staticalloc((int)Size);
		        	Marshal.Copy(Ptr, staticdata, 0, (int)Size);
	        		byte[] d = staticdata;
	        		uint val = (uint)d[0] + ((uint)d[1] << 8) + ((uint)d[2] << 16) + ((uint)d[3] << 24);
					return val;
				} else if (datatype == DataType.IntArray) {
					int[] data = new int[(int)Size/4];
		        	Marshal.Copy(Ptr, data, 0, data.Length);
					return data;
				/*} else if (datatype == DataType.String && false) {
					char[] data = new char[(int)Size/2];
		        	Marshal.Copy(Ptr, data, 0, data.Length);
					return new String(data);*/
	        	} else {
					staticalloc((int)Size);
		        	Marshal.Copy(Ptr, staticdata, 0, (int)Size);
	        		return binfmt.Deserialize(staticdata);
	        	}
			}