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

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

public Serialize ( object obj ) : MemoryStream
obj object
Результат System.IO.MemoryStream
		public MemoryStream Serialize(object obj) {
			// Reuse our memory stream by clearing it.
			// Not thread safe, obviously.
			stream.SetLength(0);
			
			Type type = obj.GetType();
			stream.WriteByte((byte)Type.GetTypeCode(type));
			
			switch (Type.GetTypeCode (type)) {
				case TypeCode.Boolean: writer.Write ((bool)obj); break;
				case TypeCode.Byte: writer.Write ((byte)obj); break;
				case TypeCode.Char: writer.Write ((char)obj); break;
				case TypeCode.DateTime: writer.Write (((DateTime)obj).Ticks); break;
				case TypeCode.Decimal: writer.Write ((decimal)obj); break;
				case TypeCode.Double: writer.Write ((double)obj); break;
				case TypeCode.Int16: writer.Write ((short)obj); break;
				case TypeCode.Int32: writer.Write ((int)obj); break;
				case TypeCode.Int64: writer.Write ((long)obj); break;
				case TypeCode.SByte: writer.Write ((sbyte)obj); break;
				case TypeCode.Single: writer.Write ((float)obj); break;
				case TypeCode.UInt16: writer.Write ((ushort)obj); break;
				case TypeCode.UInt32: writer.Write ((uint)obj); break;
				case TypeCode.UInt64: writer.Write ((ulong)obj); break;
				case TypeCode.String: writer.Write ((string)obj); break;
				default: // TypeCode.Object
					if (type.IsArray
						&& type.GetArrayRank() == 1
						&& Type.GetTypeCode(type.GetElementType()) != TypeCode.Object) {
						int length = ((Array)obj).Length;
						TypeCode innertype = Type.GetTypeCode(type.GetElementType());
						stream.WriteByte(0);
						stream.WriteByte((byte)innertype);
						writer.Write(length);
						for (int i = 0; i < length; i++) {
							switch (innertype) {
								case TypeCode.Boolean: writer.Write (((bool[])obj)[i]); break;
								case TypeCode.Byte: writer.Write (((byte[])obj)[i]); break;
								case TypeCode.Char: writer.Write (((char[])obj)[i]); break;
								case TypeCode.DateTime: writer.Write ((((DateTime[])obj)[i]).Ticks); break;
								case TypeCode.Decimal: writer.Write (((decimal[])obj)[i]); break;
								case TypeCode.Double: writer.Write (((double[])obj)[i]); break;
								case TypeCode.Int16: writer.Write (((short[])obj)[i]); break;
								case TypeCode.Int32: writer.Write (((int[])obj)[i]); break;
								case TypeCode.Int64: writer.Write (((long[])obj)[i]); break;
								case TypeCode.SByte: writer.Write (((sbyte[])obj)[i]); break;
								case TypeCode.Single: writer.Write (((float[])obj)[i]); break;
								case TypeCode.UInt16: writer.Write (((ushort[])obj)[i]); break;
								case TypeCode.UInt32: writer.Write (((uint[])obj)[i]); break;
								case TypeCode.UInt64: writer.Write (((ulong[])obj)[i]); break;
								case TypeCode.String: writer.Write (((string[])obj)[i]); break;
							}
						}
					} else {
						stream.WriteByte(1);
		       			binfmt.Serialize(stream, obj);
					}
					break;
			}
			return stream;
		}
		

Usage Example

Пример #1
0
	        public static Data New(object data, Serializer binfmt, DataType datatype) {
				Data ret = new Data();

       			if (data == null) {
					ret.Ptr = IntPtr.Zero;
					ret.Size = 0;
				} else if (datatype == DataType.UInt) {
					staticalloc(4);
					uint value = (uint)data;
					byte[] d = staticdata;
					d[0] = (byte)((value) & 0xFF);
					d[1] = (byte)((value >> 8) & 0xFF);
					d[2] = (byte)((value >> 16) & 0xFF);
					d[3] = (byte)((value >> 24) & 0xFF);
					ret.Ptr = BytesToAlloc(d, 4, 1);
					ret.Size = (uint)4;
				} else if (datatype == DataType.IntArray) {
					int[] values = (int[])data;
					ret.Size = (uint)(4*values.Length);
					ret.Ptr = BytesToAlloc(values, values.Length, 4);
				/*} else if (datatype == DataType.String && false) {
					// Somehow this is slower than the below path.
					char[] values = ((string)data).ToCharArray();
					ret.Size = (uint)(2*values.Length);
					ret.Ptr = BytesToAlloc(values, values.Length, 2);*/
       			} else {
       				MemoryStream binary = binfmt.Serialize(data);
		       		if (binary.Length > uint.MaxValue)
		       			throw new ArgumentException("data is too large");
					ret.Ptr = BytesToAlloc(binary.GetBuffer(), (int)binary.Length, 1);
					ret.Size = (uint)binary.Length;
				}
				return ret;
			}