private static LayerMask BytesToLayerMask(byte[] bytes, int dataPosition)
    {
        LayerMask result = default(LayerMask);

        result.value = BinaryDeserialization.BytesToInt(bytes, dataPosition);
        return(result);
    }
 private static LayerMask BytesToLayerMask(byte[] bytes, int dataPosition)
 {
     return(new LayerMask
     {
         value = BinaryDeserialization.BytesToInt(bytes, dataPosition)
     });
 }
    private static object LoadField(FieldSerializationData fieldSerializationData, Dictionary <int, int> fieldIndexMap, Type fieldType, string fieldName, int hashPrefix, IVariableSource variableSource, object obj = null, FieldInfo fieldInfo = null)
    {
        int num;

        if (BinaryDeserialization.shaHashSerialization)
        {
            num = hashPrefix + (BinaryDeserialization.StringHash(fieldType.Name.ToString()) + BinaryDeserialization.StringHash(fieldName));
        }
        else
        {
            num = hashPrefix + (fieldType.Name.GetHashCode() + fieldName.GetHashCode());
        }
        int num2;

        if (fieldIndexMap.TryGetValue(num, out num2))
        {
            object obj2 = null;
            if (typeof(IList).IsAssignableFrom(fieldType))
            {
                int num3 = BinaryDeserialization.BytesToInt(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
                if (fieldType.IsArray)
                {
                    Type elementType = fieldType.GetElementType();
                    if (elementType == null)
                    {
                        return(null);
                    }
                    Array array = Array.CreateInstance(elementType, num3);
                    for (int i = 0; i < num3; i++)
                    {
                        object obj3 = BinaryDeserialization.LoadField(fieldSerializationData, fieldIndexMap, elementType, i.ToString(), num / ((!BinaryDeserialization.updatedSerialization) ? 1 : (i + 1)), variableSource, obj, fieldInfo);
                        array.SetValue((!object.ReferenceEquals(obj3, null) && !obj3.Equals(null)) ? obj3 : null, i);
                    }
                    obj2 = array;
                }
                else
                {
                    Type type = fieldType;
                    while (!type.IsGenericType)
                    {
                        type = type.BaseType;
                    }
                    Type  type2 = type.GetGenericArguments()[0];
                    IList list;
                    if (fieldType.IsGenericType)
                    {
                        list = (TaskUtility.CreateInstance(typeof(List <>).MakeGenericType(new Type[]
                        {
                            type2
                        })) as IList);
                    }
                    else
                    {
                        list = (TaskUtility.CreateInstance(fieldType) as IList);
                    }
                    for (int j = 0; j < num3; j++)
                    {
                        object obj4 = BinaryDeserialization.LoadField(fieldSerializationData, fieldIndexMap, type2, j.ToString(), num / ((!BinaryDeserialization.updatedSerialization) ? 1 : (j + 1)), variableSource, obj, fieldInfo);
                        list.Add((!object.ReferenceEquals(obj4, null) && !obj4.Equals(null)) ? obj4 : null);
                    }
                    obj2 = list;
                }
            }
            else if (typeof(Task).IsAssignableFrom(fieldType))
            {
                if (fieldInfo != null && TaskUtility.HasAttribute(fieldInfo, typeof(InspectTaskAttribute)))
                {
                    string text = BinaryDeserialization.BytesToString(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2], BinaryDeserialization.GetFieldSize(fieldSerializationData, num2));
                    if (!string.IsNullOrEmpty(text))
                    {
                        Type typeWithinAssembly = TaskUtility.GetTypeWithinAssembly(text);
                        if (typeWithinAssembly != null)
                        {
                            obj2 = TaskUtility.CreateInstance(typeWithinAssembly);
                            BinaryDeserialization.LoadFields(fieldSerializationData, fieldIndexMap, obj2, num, variableSource);
                        }
                    }
                }
                else
                {
                    if (BinaryDeserialization.taskIDs == null)
                    {
                        BinaryDeserialization.taskIDs = new Dictionary <BinaryDeserialization.ObjectFieldMap, List <int> >(new BinaryDeserialization.ObjectFieldMapComparer());
                    }
                    int item = BinaryDeserialization.BytesToInt(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
                    BinaryDeserialization.ObjectFieldMap key = new BinaryDeserialization.ObjectFieldMap(obj, fieldInfo);
                    if (BinaryDeserialization.taskIDs.ContainsKey(key))
                    {
                        BinaryDeserialization.taskIDs[key].Add(item);
                    }
                    else
                    {
                        List <int> list2 = new List <int>();
                        list2.Add(item);
                        BinaryDeserialization.taskIDs.Add(key, list2);
                    }
                }
            }
            else if (typeof(SharedVariable).IsAssignableFrom(fieldType))
            {
                obj2 = BinaryDeserialization.BytesToSharedVariable(fieldSerializationData, fieldIndexMap, fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2], variableSource, true, num);
            }
            else if (typeof(UnityEngine.Object).IsAssignableFrom(fieldType))
            {
                int index = BinaryDeserialization.BytesToInt(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
                obj2 = BinaryDeserialization.IndexToUnityObject(index, fieldSerializationData);
            }
            else if (fieldType.Equals(typeof(int)) || fieldType.IsEnum)
            {
                obj2 = BinaryDeserialization.BytesToInt(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(uint)))
            {
                obj2 = BinaryDeserialization.BytesToUInt(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(float)))
            {
                obj2 = BinaryDeserialization.BytesToFloat(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(double)))
            {
                obj2 = BinaryDeserialization.BytesToDouble(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(long)))
            {
                obj2 = BinaryDeserialization.BytesToLong(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(bool)))
            {
                obj2 = BinaryDeserialization.BytesToBool(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(string)))
            {
                obj2 = BinaryDeserialization.BytesToString(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2], BinaryDeserialization.GetFieldSize(fieldSerializationData, num2));
            }
            else if (fieldType.Equals(typeof(byte)))
            {
                obj2 = BinaryDeserialization.BytesToByte(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(Vector2)))
            {
                obj2 = BinaryDeserialization.BytesToVector2(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(Vector3)))
            {
                obj2 = BinaryDeserialization.BytesToVector3(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(Vector4)))
            {
                obj2 = BinaryDeserialization.BytesToVector4(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(Quaternion)))
            {
                obj2 = BinaryDeserialization.BytesToQuaternion(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(Color)))
            {
                obj2 = BinaryDeserialization.BytesToColor(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(Rect)))
            {
                obj2 = BinaryDeserialization.BytesToRect(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(Matrix4x4)))
            {
                obj2 = BinaryDeserialization.BytesToMatrix4x4(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(AnimationCurve)))
            {
                obj2 = BinaryDeserialization.BytesToAnimationCurve(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.Equals(typeof(LayerMask)))
            {
                obj2 = BinaryDeserialization.BytesToLayerMask(fieldSerializationData.byteDataArray, fieldSerializationData.dataPosition[num2]);
            }
            else if (fieldType.IsClass || (fieldType.IsValueType && !fieldType.IsPrimitive))
            {
                obj2 = TaskUtility.CreateInstance(fieldType);
                BinaryDeserialization.LoadFields(fieldSerializationData, fieldIndexMap, obj2, num, variableSource);
                return(obj2);
            }
            return(obj2);
        }
        if (fieldType.IsAbstract)
        {
            return(null);
        }
        if (typeof(SharedVariable).IsAssignableFrom(fieldType))
        {
            SharedVariable sharedVariable  = TaskUtility.CreateInstance(fieldType) as SharedVariable;
            SharedVariable sharedVariable2 = fieldInfo.GetValue(obj) as SharedVariable;
            if (sharedVariable2 != null)
            {
                sharedVariable.SetValue(sharedVariable2.GetValue());
            }
            return(sharedVariable);
        }
        return(null);
    }