Example #1
0
        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);
        }
Example #2
0
        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);
        }