Example #1
0
        /// <summary>
        /// 将流字节数组序列化为指定类型
        /// </summary>
        /// <param name="type"></param>
        /// <param name="buffer"></param>
        /// <returns></returns>
        protected virtual object DeserializeObject(Type type, byte[] buffer)
        {
            //all length
            //, item 1 name size, item 1 name data, item 1 value size, item 1 value data
            //, item 2 name size,  item 2 name data, item 2 value size, item 2 value data
            //, item N name size,  item N name data, item N value size, item N value data
            var    instance = Activator.CreateInstance(type);
            object itemValue;
            string itemName;
            int    itemSize;

            byte[] itemBuffer;
            System.Reflection.PropertyInfo propertyInfo;

            //all length
            var psLength = BaseDataConverter.ToInt32(buffer);
            var offset   = SIZE_INT32;

            //
            for (int i = 0; i < psLength; i++)
            {
                //name
                itemSize = BaseDataConverter.ToInt32(buffer, offset);
                offset  += SIZE_INT32;
                itemName = Encoding.UTF8.GetString(buffer, offset, itemSize);
                offset  += itemSize;

                //value
                itemSize = BaseDataConverter.ToInt32(buffer, offset);
                offset  += SIZE_INT32;

                if (itemSize == -1)
                {
                    //set
                    propertyInfo = PropertyAccessor.FindProperty(instance, itemName);
                    if (propertyInfo != null)
                    {
                        PropertyAccessor.SetValue(instance, itemName, null);
                    }
                }
                else
                {
                    itemBuffer = new byte[itemSize];
                    Array.Copy(buffer, offset, itemBuffer, 0, itemSize);
                    offset += itemSize;

                    //set
                    propertyInfo = PropertyAccessor.FindProperty(instance, itemName);
                    itemValue    = this.Deserialize(propertyInfo.PropertyType, itemBuffer);
                    if (propertyInfo != null)
                    {
                        PropertyAccessor.SetValue(instance, itemName, itemValue);
                    }
                }
            }
            return(instance);
        }
Example #2
0
        /// <summary>
        /// 解析指定类型数组对象
        /// </summary>
        /// <param name="type"></param>
        /// <param name="buffer"></param>
        /// <returns></returns>
        private object DeserializeArray(Type type, byte[] buffer)
        {
            //legnth
            var arrayLength = BaseDataConverter.ToInt32(buffer);
            var offset      = SIZE_INT32;
            var elementType = type.GetElementType();

            //
            if (TYPE_STRING.Equals(elementType))
            {
                //item length,  item size1, item 1, item size 2, item 2, item size N, item N
                var stringArray = new string[arrayLength];
                var itemSize    = 0;
                for (int i = 0; i < arrayLength; i++)
                {
                    itemSize = BaseDataConverter.ToInt32(buffer, offset);
                    offset  += SIZE_INT32;

                    if (itemSize == -1)
                    {
                        stringArray[i] = null;
                    }
                    else if (itemSize == 0)
                    {
                        stringArray[i] = "";
                    }
                    else
                    {
                        stringArray[i] = Encoding.UTF8.GetString(buffer, offset, itemSize);
                        offset        += itemSize;
                    }
                }
                return(stringArray);
            }

            if (TYPE_DATETIME.Equals(elementType))
            {
                var workArray = new DateTime[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    //workArray[i] = new DateTime(BaseDataConverter.ToInt64(buffer, offset), DateTimeKind.Utc);
                    workArray[i] = new DateTime(BaseDataConverter.ToInt64(buffer, offset));
                    offset      += SIZE_DATETIME;
                }
                return(workArray);
            }

            if (TYPE_BOOLEAN.Equals(elementType))
            {
                var workArray = new Boolean[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = buffer[offset] == 1;
                    offset      += SIZE_BOOLEAN;
                }
                return(workArray);
            }

            if (TYPE_BYTE.Equals(elementType))
            {
                var workArray = new Byte[arrayLength];
                Array.Copy(buffer, offset, workArray, 0, arrayLength);
                return(workArray);
            }

            if (TYPE_SBYTE.Equals(elementType))
            {
                var workArray = new SByte[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = (SByte)buffer[offset];
                    offset      += SIZE_SBYTE;
                }
                return(workArray);
            }

            if (TYPE_INT16.Equals(elementType))
            {
                var workArray = new Int16[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = BaseDataConverter.ToInt16(buffer, offset);
                    offset      += SIZE_INT16;
                }
                return(workArray);
            }

            if (TYPE_UINT16.Equals(elementType))
            {
                var workArray = new UInt16[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = BaseDataConverter.ToUInt16(buffer, offset);
                    offset      += SIZE_UINT16;
                }
                return(workArray);
            }

            if (TYPE_INT32.Equals(elementType))
            {
                var workArray = new Int32[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = BaseDataConverter.ToInt32(buffer, offset);
                    offset      += SIZE_INT32;
                }
                return(workArray);
            }

            if (TYPE_UINT32.Equals(elementType))
            {
                var workArray = new UInt32[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = BaseDataConverter.ToUInt32(buffer, offset);
                    offset      += SIZE_UINT32;
                }
                return(workArray);
            }

            if (TYPE_INT64.Equals(elementType))
            {
                var workArray = new Int64[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = BaseDataConverter.ToInt64(buffer, offset);
                    offset      += SIZE_INT64;
                }
                return(workArray);
            }

            if (TYPE_UINT64.Equals(elementType))
            {
                var workArray = new UInt64[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = BaseDataConverter.ToUInt64(buffer, offset);
                    offset      += SIZE_UINT64;
                }
                return(workArray);
            }

            if (TYPE_CHAR.Equals(elementType))
            {
                var workArray = new Char[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = BaseDataConverter.ToChar(buffer, offset);
                    offset      += SIZE_CHAR;
                }
                return(workArray);
            }

            if (TYPE_DOUBLE.Equals(elementType))
            {
                var workArray = new Double[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = BaseDataConverter.ToDouble(buffer, offset);
                    offset      += SIZE_DOUBLE;
                }
                return(workArray);
            }

            if (TYPE_SINGLE.Equals(elementType))
            {
                var workArray = new Single[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = BaseDataConverter.ToSingle(buffer, offset);
                    offset      += SIZE_SINGLE;
                }
                return(workArray);
            }

            if (TYPE_DECIMAL.Equals(elementType))
            {
                var workArray = new Decimal[arrayLength];
                for (int i = 0; i < arrayLength; i++)
                {
                    workArray[i] = BaseDataConverter.ToDecimal(buffer, offset);
                    offset      += SIZE_DECIMAL;
                }
                return(workArray);
            }
            else
            {
                //item length,  item size1, item 1, item size 2, item 2, item size N, item N

                var    workArray = (IList)Array.CreateInstance(elementType, arrayLength);
                int    itemSize;
                byte[] itemBuffer;
                for (int i = 0; i < arrayLength; i++)
                {
                    itemSize = BaseDataConverter.ToInt32(buffer, offset);
                    offset  += SIZE_INT32;

                    if (itemSize == -1)
                    {
                        workArray[i] = null;
                    }
                    else if (elementType.IsArray)
                    {
                        itemBuffer = new byte[itemSize];
                        Array.Copy(buffer, offset, itemBuffer, 0, itemSize);
                        workArray[i] = this.DeserializeArray(elementType, itemBuffer);
                        offset      += itemSize;
                    }
                    else
                    {
                        itemBuffer = new byte[itemSize];
                        Array.Copy(buffer, offset, itemBuffer, 0, itemSize);
                        workArray[i] = this.DeserializeObject(elementType, itemBuffer);
                        offset      += itemSize;
                    }
                }
                return(workArray);
            }
        }
Example #3
0
        /// <summary>
        /// 返回指定类型的数据
        /// </summary>
        /// <param name="type"></param>
        /// <param name="buffer"></param>
        /// <returns></returns>
        public object Deserialize(Type type, byte[] buffer)
        {
            //default
            if (buffer == null)
            {
                if (type.IsValueType)
                {
                    return(System.Activator.CreateInstance(type));
                }
                return(null);
            }

            if (TYPE_BOOLEAN.Equals(type))
            {
                return(buffer[0] == 1);
            }

            if (TYPE_BYTE.Equals(type))
            {
                return(buffer[0]);
            }

            if (TYPE_SBYTE.Equals(type))
            {
                return((sbyte)buffer[0]);
            }

            if (TYPE_CHAR.Equals(type))
            {
                return(BaseDataConverter.ToChar(buffer));
            }

            if (TYPE_INT16.Equals(type))
            {
                return(BaseDataConverter.ToInt16(buffer));
            }

            if (TYPE_UINT16.Equals(type))
            {
                return(BaseDataConverter.ToUInt16(buffer));
            }

            if (TYPE_INT32.Equals(type))
            {
                return(BaseDataConverter.ToInt32(buffer));
            }

            if (TYPE_SINGLE.Equals(type))
            {
                return(BaseDataConverter.ToSingle(buffer));
            }

            if (TYPE_UINT32.Equals(type))
            {
                return(BaseDataConverter.ToUInt32(buffer));
            }

            if (TYPE_DATETIME.Equals(type))
            {
                return(new DateTime(BaseDataConverter.ToInt64(buffer)));
            }
            //return new DateTime(BaseDataConverter.ToInt64(buffer), DateTimeKind.Utc);

            if (TYPE_DOUBLE.Equals(type))
            {
                return(BaseDataConverter.ToDouble(buffer));
            }

            if (TYPE_INT64.Equals(type))
            {
                return(BaseDataConverter.ToInt64(buffer));
            }

            if (TYPE_UINT64.Equals(type))
            {
                return(BaseDataConverter.ToUInt64(buffer));
            }

            if (TYPE_DECIMAL.Equals(type))
            {
                return(BaseDataConverter.ToDecimal(buffer));
            }

            if (TYPE_STRING.Equals(type))
            {
                return(Encoding.UTF8.GetString(buffer));
            }

            if (type.IsArray)
            {
                return(this.DeserializeArray(type, buffer));
            }

            return(this.DeserializeObject(type, buffer));
        }