private static object ReadAndCheckNull(SimpleTypeReader simpleTypeReader)
 {
     var isNull = simpleTypeReader.Read<bool>();
     return isNull ? null : simpleTypeReader.ReadWithMark();
 }
        private static SimpleList<ComplexTypeDef> ReadComplexTypeDefs(SimpleTypeReader simpleTypeReader)
        {
            var complextTypeDefs = new SimpleList<ComplexTypeDef>();

            var serializedObjDefCount = simpleTypeReader.Read<int>();
            for (var i = 0; i < serializedObjDefCount; i++)
            {
                var complexTypeMark = simpleTypeReader.Read<ComplexTypeMark>();

                if (complexTypeMark == ComplexTypeMark.Array)
                {
                    #region Array

                    var id = simpleTypeReader.Read<int>();
                    var typeInfoId = simpleTypeReader.Read<int>();

                    var itemsCount = simpleTypeReader.Read<int>();
                    var items = new SimpleList<object>(itemsCount);
                    for (var j = 0; j < itemsCount; j++)
                        items.Add(ReadAndCheckNull(simpleTypeReader));

                    var indiciesCount = simpleTypeReader.Read<byte>();
                    var indicies = new SimpleList<int>(indiciesCount);
                    for (var j = 0; j < indiciesCount; j++)
                        indicies.Add(simpleTypeReader.Read<int>());

                    complextTypeDefs.Add(new ArrayDef
                    {
                        Id = id,
                        TypeInfoId = typeInfoId,
                        Items = items,
                        Indicies = indicies
                    });

                    #endregion
                }
                else if (complexTypeMark == ComplexTypeMark.List)
                {
                    #region List

                    var id = simpleTypeReader.Read<int>();
                    var typeInfoId = simpleTypeReader.Read<int>();

                    var itemsCount = simpleTypeReader.Read<int>();
                    var items = new SimpleList<object>(itemsCount);
                    for (var j = 0; j < itemsCount; j++)
                        items.Add(ReadAndCheckNull(simpleTypeReader));

                    complextTypeDefs.Add(new ListDef
                    {
                        Id = id,
                        TypeInfoId = typeInfoId,
                        Items = items
                    });

                    #endregion
                }
                else if (complexTypeMark == ComplexTypeMark.Dictionary)
                {
                    #region Dictionary

                    var id = simpleTypeReader.Read<int>();
                    var typeInfoId = simpleTypeReader.Read<int>();

                    var keysCount = simpleTypeReader.Read<int>();
                    var keys = new SimpleList<object>(keysCount);
                    for (var j = 0; j < keysCount; j++)
                        keys.Add(ReadAndCheckNull(simpleTypeReader));

                    var valuesCount = simpleTypeReader.Read<int>();
                    var values = new SimpleList<object>(valuesCount);
                    for (var j = 0; j < keysCount; j++)
                        values.Add(ReadAndCheckNull(simpleTypeReader));

                    complextTypeDefs.Add(new DictionaryDef
                    {
                        Id = id,
                        TypeInfoId = typeInfoId,
                        Keys = keys,
                        Values = values
                    });

                    #endregion
                }
                else if (complexTypeMark == ComplexTypeMark.UserDefined)
                {
                    #region UserDefined

                    var id = simpleTypeReader.Read<int>();
                    var typeInfoId = simpleTypeReader.Read<int>();

                    var namesCount = simpleTypeReader.Read<byte>();
                    var names = new SimpleList<byte>(namesCount);
                    for (var j = 0; j < namesCount; j++)
                        names.Add(simpleTypeReader.Read<byte>());

                    var valuesCount = simpleTypeReader.Read<byte>();
                    var values = new SimpleList<object>(valuesCount);
                    for (var j = 0; j < namesCount; j++)
                        values.Add(ReadAndCheckNull(simpleTypeReader));

                    complextTypeDefs.Add(new UserDefinedDef
                    {
                        Id = id,
                        TypeInfoId = typeInfoId,
                        Names = names,
                        Values = values
                    });

                    #endregion
                }
                else throw new Exception(string.Format("Unknown ComplexTypeMark {0}", complexTypeMark));
            }

            return complextTypeDefs;
        }
        private static SimpleList<TypeInfo> ReadTypeInfos(SimpleTypeReader simpleTypeReader)
        {
            var typeInfos = new SimpleList<TypeInfo>();
            var serializedTypeInfoCount = simpleTypeReader.Read<int>();
            for (var i = 0; i < serializedTypeInfoCount; i++)
            {
                var id = simpleTypeReader.Read<int>();
                var typeName = simpleTypeReader.Read<string>();
                var isEnumerable = simpleTypeReader.Read<bool>();
                var typeInfo = new TypeInfo
                    {
                        Id = id,
                        TypeName = typeName,
                        IsEnumerable = isEnumerable
                    };

                if (!isEnumerable)
                {
                    var propertyNamesCount = simpleTypeReader.Read<byte>();
                    var propertyNames = new SimpleList<string>(propertyNamesCount);
                    for (var j = 0; j < propertyNamesCount; j++)
                        propertyNames.Add(simpleTypeReader.Read<string>());
                    typeInfo.PropertyNames = propertyNames;
                }
                typeInfos.Add(typeInfo);
            }
            return typeInfos;
        }