コード例 #1
0
        public object Deserialize(CacheItem item)
        {
            if (item.Segment.Array == null)
            {
                return(null);
            }

            if (item.Flags == RawDataFlag || (item.Flags & 0x1ff) != item.Flags)
            {
                var tmp = item.Segment;
                if (tmp.Count == tmp.Array.Length)
                {
                    return(tmp.Array);
                }

                // TODO improve memcpy
                var retval = new byte[tmp.Count];
                Buffer.BlockCopy(tmp.Array, 0, retval, 0, tmp.Count);

                return(retval);
            }

            var code = (TypeCode)(item.Flags & 0xff);
            var data = item.Segment;

            switch (code)
            {
            case TypeCode.DBNull: return(null);

            // incrementing a non-existing key then getting it
            // returns as a string, but the flag will be 0
            // so treat all 0 flagged items as string
            // this may help inter-client data management as well
            case TypeCode.Empty:
            case TypeCode.String: return(DeserializeString(data));

            case TypeCode.Byte: return(data.Array[0]);

            case TypeCode.SByte: return((sbyte)data.Array[0]);

            case TypeCode.Boolean: return(PooledBitConverter.ToBoolean(data));

            case TypeCode.Char: return(PooledBitConverter.ToChar(data));

            case TypeCode.Int16: return(PooledBitConverter.ToInt16(data));

            case TypeCode.Int32: return(PooledBitConverter.ToInt32(data));

            case TypeCode.Int64: return(PooledBitConverter.ToInt64(data));

            case TypeCode.UInt16: return(PooledBitConverter.ToUInt16(data));

            case TypeCode.UInt32: return(PooledBitConverter.ToUInt32(data));

            case TypeCode.UInt64: return(PooledBitConverter.ToUInt64(data));

            case TypeCode.DateTime: return(DateTime.FromBinary(PooledBitConverter.ToInt64(data)));

            case TypeCode.Single: return(PooledBitConverter.ToSingle(data));

            case TypeCode.Double: return(PooledBitConverter.ToDouble(data));

            case TypeCode.Decimal: return(PooledBitConverter.ToDecimal(data));

            case TypeCode.Object: return(DeserializeObject(data));

            default: throw new InvalidOperationException("Unknown TypeCode was returned: " + code);
            }
        }
コード例 #2
0
        public CacheItem Serialize(object value)
        {
            // - or we just received a byte[]. No further processing is needed.
            var tmpByteArray = value as byte[];

            if (tmpByteArray != null)
            {
                return(new CacheItem(RawDataFlag, new PooledSegment(tmpByteArray, tmpByteArray.Length)));
            }

            // got some real data, serialize it
            var code = value == null
                                                ? TypeCode.DBNull
                                                : Type.GetTypeCode(value.GetType());

            PooledSegment data;

            switch (code)
            {
            case TypeCode.Empty:
            case TypeCode.DBNull: data = PooledSegment.Empty; break;

            case TypeCode.String: data = SerializeString((String)value); break;

            case TypeCode.SByte: data = PooledBitConverter.GetBytes(allocator, (SByte)value); break;

            case TypeCode.Byte: data = PooledBitConverter.GetBytes(allocator, (Byte)value); break;

            case TypeCode.Boolean: data = PooledBitConverter.GetBytes(allocator, (Boolean)value); break;

            case TypeCode.Char: data = PooledBitConverter.GetBytes(allocator, (Char)value); break;

            case TypeCode.Int16: data = PooledBitConverter.GetBytes(allocator, (Int16)value); break;

            case TypeCode.Int32: data = PooledBitConverter.GetBytes(allocator, (Int32)value); break;

            case TypeCode.Int64: data = PooledBitConverter.GetBytes(allocator, (Int64)value); break;

            case TypeCode.UInt16: data = PooledBitConverter.GetBytes(allocator, (UInt16)value); break;

            case TypeCode.UInt32: data = PooledBitConverter.GetBytes(allocator, (UInt32)value); break;

            case TypeCode.UInt64: data = PooledBitConverter.GetBytes(allocator, (UInt64)value); break;

            case TypeCode.DateTime: data = PooledBitConverter.GetBytes(allocator, ((DateTime)value).ToBinary()); break;

            case TypeCode.Single: data = PooledBitConverter.GetBytes(allocator, (Single)value); break;

            case TypeCode.Double: data = PooledBitConverter.GetBytes(allocator, (Double)value); break;

            case TypeCode.Decimal: data = PooledBitConverter.GetBytes(allocator, (Decimal)value); break;

            case TypeCode.Object:
                // raw data is a special case when someone passes in a buffer (byte[] or ArraySegment<byte>)
                // ArraySegment<byte> is only passed in when a part of buffer is being
                // serialized, usually from a MemoryStream (To avoid duplicating arrays
                // the byte[] returned by MemoryStream.GetBuffer is placed into an ArraySegment.)
                if (value is ArraySegment <byte> )
                {
                    return(new CacheItem(RawDataFlag, PooledSegment.From((ArraySegment <byte>)value)));
                }

                data = SerializeObject(value); break;

            default: throw new InvalidOperationException("Unknown TypeCode was returned: " + code);
            }

            return(new CacheItem((uint)((int)code | 0x100), data));
        }