示例#1
0
        public static DataTable DeserializeDataTable(BinaryTypesReader br)
        {
            DataTable table = new DataTable();

            table.TableName = br.ReadString();

            int columnCount = br.Read7BitInt();

            Type[] columnTypes = new Type[columnCount];

            for (int i = 0; i < columnCount; i++)
            {
                string columnName = br.ReadString();
                string typeName   = br.ReadString();
                Type   columnType = Type.GetType(typeName);

                DataColumn col = new DataColumn(columnName, columnType);
                table.Columns.Add(col);

                columnTypes[i] = columnType;
            }

            int rowsCount = br.Read7BitInt();

            for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++)
            {
                DataRow row = table.NewRow();
                table.Rows.Add(row);

                for (int i = 0; i < columnCount; i++)
                {
                    if (columnTypes[i] == typeof(System.String))
                    {
                        row[i] = br.ReadString();
                    }
                    else if (columnTypes[i] == typeof(System.Int32))
                    {
                        row[i] = br.Read7BitInt();
                    }
                    else if (columnTypes[i] == typeof(System.Int64))
                    {
                        row[i] = br.Read7BitLong();
                    }
                    else if (columnTypes[i] == typeof(System.Decimal))
                    {
                        row[i] = br.ReadCompactDecimal();
                    }
                    else if (columnTypes[i] == typeof(System.DateTime))
                    {
                        row[i] = br.ReadCompactDateTime(TimeSpan.TicksPerMillisecond * 100);
                    }
                    else if (columnTypes[i] == typeof(bool))
                    {
                        row[i] = br.ReadBoolean();
                    }
                }
            }

            return(table);
        }
示例#2
0
        ///////////////////////////////////////////////////////////////////////
        // Can be used by Disctionary<X, List<long>>
        public static List <long> ReadLongsList(BinaryTypesReader br, object objParam)
        {
            List <long> result = new List <long>();

            SerializationUtils.DeserializeList(br, result, SerializationUtils.ReadLong, null);
            return(result);
        }
示例#3
0
 public static object DeserializeObject(byte[] buf, Type type, SerializerSettings settings)
 {
     using (MemoryStream ms = new MemoryStream(buf))
     {
         using (BinaryTypesReader br = new BinaryTypesReader(ms))
         {
             return(DeserializeObject(br, type, settings, null, null));
         }
     }
 }
 public static object DeserializeObject(byte[] buf, Type type)
 {
     using (MemoryStream ms = new MemoryStream(buf))
     {
         using (BinaryTypesReader br = new BinaryTypesReader(ms))
         {
             return(DeserializeObject(br, type));
         }
     }
 }
示例#5
0
        public static void DeserializeList <T>(BinaryTypesReader br, List <T> list, ReadDataDelegate <T> itemReader, object objParam)
        {
            //Clear the list before work starts. In case the list is null it will throw exception
            list.Clear();
            int count = br.Read7BitInt();

            for (int i = 0; i < count; i++)
            {
                T item = itemReader(br, objParam);
                list.Add(item);
            }
        }
        private static object DeserializeClass(BinaryTypesReader br, Type type)
        {
            var props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public)
                        .OrderBy(x => x.MetadataToken);

            var instance = Activator.CreateInstance(type);


            foreach (var prop in props)
            {
                prop.SetValue(instance, DeserializeObject(br, prop.PropertyType));
            }

            return(instance);
        }
示例#7
0
        public static void DeserializeDictionary <K, V>(
            BinaryTypesReader br,
            IDictionary <K, V> map,
            ReadDataDelegate <K> keyReader,
            object keyObjParam,
            ReadDataDelegate <V> valReader,
            object valObjParam)
        {
            int count = br.Read7BitInt();

            for (int i = 0; i < count; i++)
            {
                K key = keyReader(br, keyObjParam);
                V val = valReader(br, valObjParam);
                map.Add(key, val);
            }
        }
示例#8
0
        internal static object DeserializeObject(BinaryTypesReader br, Type type, SerializerSettings settings, ISerializer serializer, ISerializerArg serializerArg)
        {
            serializer = GetSerializer(type, serializer);
            if (serializer == null)
            {
                throw new Exception($"SerializeObject: serializer not found for type {type.FullName}");
            }

            if (type.IsClass && serializer.CommonNullHandle)
            {
                if (br.ReadBoolean() == false) //null
                {
                    return(null);
                }
            }

            return(serializer.Deserialize(br, type, settings, serializerArg));
        }
示例#9
0
        ///////////////////////////////////////////////////////////////////////

        public static bool ReadBool(BinaryTypesReader br, object objParam)
        {
            return(br.ReadBoolean());
        }
示例#10
0
        ///////////////////////////////////////////////////////////////////////

        public static decimal ReadCompactDecimal(BinaryTypesReader br, object objParam)
        {
            return(br.ReadCompactDecimal());
        }
示例#11
0
        ///////////////////////////////////////////////////////////////////////

        public static byte[] ReadBytesArray(BinaryTypesReader br, object objParam)
        {
            return(br.ReadBytesArray());
        }
示例#12
0
        ///////////////////////////////////////////////////////////////////////

        public static long ReadLong(BinaryTypesReader br, object objParam)
        {
            return(br.Read7BitLong());
        }
示例#13
0
        ///////////////////////////////////////////////////////////////////////

        // Uses reflection - relatively slow!!!
        public static T ReadEnum <T>(BinaryTypesReader br, object objParam) where T : IConvertible
        {
            long val = br.Read7BitLong();

            return((T)Enum.ToObject(typeof(T), val));
        }
示例#14
0
        ///////////////////////////////////////////////////////////////////////

        public static int ReadInt(BinaryTypesReader br, object objParam)
        {
            return(br.Read7BitInt());
        }
示例#15
0
        ///////////////////////////////////////////////////////////////////////

        public static string ReadString(BinaryTypesReader br, object objParam)
        {
            return(br.ReadString());
        }
        private static object DeserializeObject(BinaryTypesReader br, Type type)
        {
            if (type.IsPrimitive)
            {
                switch (type.FullName)
                {
                case SystemTypeDefs.FullNameBoolean:
                case SystemTypeDefs.FullNameByte:
                case SystemTypeDefs.FullNameSByte:
                case SystemTypeDefs.FullNameInt16:
                case SystemTypeDefs.FullNameUInt16:
                case SystemTypeDefs.FullNameInt32:
                case SystemTypeDefs.FullNameUInt32:
                case SystemTypeDefs.FullNameInt64:
                case SystemTypeDefs.FullNameUInt64:
                case SystemTypeDefs.FullNameChar:
                {
                    var val = br.Read7BitLong();
                    return(Convert.ChangeType(val, type));
                }

                case SystemTypeDefs.FullNameSingle:     // todo: compact
                    return(br.ReadSingle());

                case SystemTypeDefs.FullNameDouble:     // todo: compact
                    return(br.ReadDouble());
                }
            }

            if (type.FullName == typeof(decimal).FullName)
            {
                return(br.ReadCompactDecimal());
            }

            if (type.IsEnum)
            {
                int val = (int)br.Read7BitLong();
                return(Enum.ToObject(type, val));
            }

            if (type.IsValueType)
            {
                switch (type.FullName)
                {
                case SystemTypeDefs.FullNameDateTime:
                    return(new DateTime(br.Read7BitLong()));
                }
            }

            if (type.IsClass)
            {
                switch (type.FullName)
                {
                case SystemTypeDefs.FullNameString:
                    return(br.ReadString());

                default:
                    return(DeserializeClass(br, type));
                }
            }

            return(null);
        }