private static bool ReadIfPrimitiveOrNull(BinaryReader reader, DObject.TypeCode type, out object value, out DeserializationScope scope) { if (type != DObject.TypeCode.DObject && !type.HasFlag(DObject.TypeCode.Array)) { scope = null; switch (type) { case DObject.TypeCode.Boolean: value = reader.ReadBoolean(); return(true); case DObject.TypeCode.Char: value = reader.ReadChar(); return(true); case DObject.TypeCode.SByte: value = reader.ReadSByte(); return(true); case DObject.TypeCode.Byte: value = reader.ReadByte(); return(true); case DObject.TypeCode.Int16: value = reader.ReadInt16(); return(true); case DObject.TypeCode.UInt16: value = reader.ReadUInt16(); return(true); case DObject.TypeCode.Int32: value = reader.ReadInt32(); return(true); case DObject.TypeCode.UInt32: value = reader.ReadUInt32(); return(true); case DObject.TypeCode.Int64: value = reader.ReadInt64(); return(true); case DObject.TypeCode.UInt64: value = reader.ReadUInt64(); return(true); case DObject.TypeCode.Single: value = reader.ReadSingle(); return(true); case DObject.TypeCode.Double: value = reader.ReadDouble(); return(true); case DObject.TypeCode.Decimal: value = reader.ReadDecimal(); return(true); case DObject.TypeCode.DateTime: value = DateTime.FromBinary(reader.ReadInt64()); return(true); case DObject.TypeCode.TimeSpan: value = TimeSpan.FromTicks(reader.ReadInt64()); return(true); case DObject.TypeCode.String: { byte b = reader.ReadByte(); value = ((b == 0) ? null : reader.ReadString()); return(true); } case DObject.TypeCode.Guid: value = new Guid(reader.ReadBytes(16)); return(true); default: throw new ArgumentOutOfRangeException("type", type, null); } } int num = reader.ReadInt32(); if (num < 0) { value = null; scope = null; return(true); } if (num < 1) { scope = null; if (type == DObject.TypeCode.DObject) { value = new DObject(); return(true); } switch (type & ~DObject.TypeCode.Array) { case DObject.TypeCode.DObject: value = ZeroLengthArrays.DObject; return(true); case DObject.TypeCode.Boolean: value = ZeroLengthArrays.Boolean; return(true); case DObject.TypeCode.Char: value = ZeroLengthArrays.Char; return(true); case DObject.TypeCode.SByte: value = ZeroLengthArrays.SByte; return(true); case DObject.TypeCode.Byte: value = ZeroLengthArrays.Byte; return(true); case DObject.TypeCode.Int16: value = ZeroLengthArrays.Int16; return(true); case DObject.TypeCode.UInt16: value = ZeroLengthArrays.UInt16; return(true); case DObject.TypeCode.Int32: value = ZeroLengthArrays.Int32; return(true); case DObject.TypeCode.UInt32: value = ZeroLengthArrays.UInt32; return(true); case DObject.TypeCode.Int64: value = ZeroLengthArrays.Int64; return(true); case DObject.TypeCode.UInt64: value = ZeroLengthArrays.UInt64; return(true); case DObject.TypeCode.Single: value = ZeroLengthArrays.Single; return(true); case DObject.TypeCode.Double: value = ZeroLengthArrays.Double; return(true); case DObject.TypeCode.Decimal: value = ZeroLengthArrays.Decimal; return(true); case DObject.TypeCode.DateTime: value = ZeroLengthArrays.DateTime; return(true); case DObject.TypeCode.TimeSpan: value = ZeroLengthArrays.TimeSpan; return(true); case DObject.TypeCode.String: value = ZeroLengthArrays.String; return(true); case DObject.TypeCode.Guid: value = ZeroLengthArrays.Guid; return(true); default: throw new ArgumentOutOfRangeException(); } } if (type == DObject.TypeCode.DObject) { scope = new DeserializationScope(new DObject(), num); value = null; return(false); } scope = new DeserializationScope(new List <object>(), type, num); value = null; return(false); }
private static bool WriteIfPrimitiveOrNull(BinaryWriter writer, DObject.TypeCode type, object value, out SerializationScope scope) { if (type != DObject.TypeCode.DObject && !type.HasFlag(DObject.TypeCode.Array)) { scope = null; switch (type) { case DObject.TypeCode.Boolean: writer.Write((bool)value); return(true); case DObject.TypeCode.Char: writer.Write((char)value); return(true); case DObject.TypeCode.SByte: writer.Write((sbyte)value); return(true); case DObject.TypeCode.Byte: writer.Write((byte)value); return(true); case DObject.TypeCode.Int16: writer.Write((short)value); return(true); case DObject.TypeCode.UInt16: writer.Write((ushort)value); return(true); case DObject.TypeCode.Int32: writer.Write((int)value); return(true); case DObject.TypeCode.UInt32: writer.Write((uint)value); return(true); case DObject.TypeCode.Int64: writer.Write((long)value); return(true); case DObject.TypeCode.UInt64: writer.Write((ulong)value); return(true); case DObject.TypeCode.Single: writer.Write((float)value); return(true); case DObject.TypeCode.Double: writer.Write((double)value); return(true); case DObject.TypeCode.Decimal: writer.Write((decimal)value); return(true); case DObject.TypeCode.DateTime: writer.Write(((DateTime)value).ToBinary()); return(true); case DObject.TypeCode.TimeSpan: writer.Write(((TimeSpan)value).Ticks); return(true); case DObject.TypeCode.String: if (value == null) { writer.Write((byte)0); } else { writer.Write((byte)1); writer.Write((string)value); } return(true); case DObject.TypeCode.Guid: writer.Write(((Guid)value).ToByteArray()); return(true); default: throw new ArgumentOutOfRangeException("type", type, null); } } if (value == null) { writer.Write(-1); scope = null; return(true); } if (type == DObject.TypeCode.DObject) { DObject dObject = (DObject)value; if (dObject.Count < 1) { writer.Write(0); scope = null; return(true); } writer.Write(dObject.Count); scope = new SerializationScope(dObject); return(false); } Array array = (Array)value; if (array.Length < 1) { writer.Write(0); scope = null; return(true); } writer.Write(array.Length); scope = new SerializationScope(array, type); return(false); }