public static int GetObjectSize(Type type, object instance) { try { return(RawSerializer.GetFieldSize(type, null, instance)); } catch (Exception value) { Console.WriteLine(value); } return(-1); }
private static int GetFieldSize(Type type, FieldInfo ownerFieldInfo, object instance) { int num = 0; if (type.IsPrimitive) { if (!RawSerializer.TryGetPrimitiveSize(type, out num)) { throw new UnknownLengthException(ownerFieldInfo); } } else if (type == typeof(string)) { if (instance == null) { throw new UnknownLengthException(ownerFieldInfo); } num += 2; num += (instance as string).Length * 2; } else { FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo[] array = fields; for (int i = 0; i < array.Length; i++) { FieldInfo fieldInfo = array[i]; if (!RawSerializer.IsIngoreField(fieldInfo)) { Type fieldType = fieldInfo.FieldType; LengthAttribute lengthAttribute = Attribute.GetCustomAttribute(fieldInfo, typeof(LengthAttribute)) as LengthAttribute; if (fieldType.IsArray) { if (lengthAttribute != null) { num += lengthAttribute.Length * RawSerializer.GetFieldSize(fieldType.GetElementType(), fieldInfo, instance); } else { if (instance == null) { throw new UnknownLengthException(fieldInfo); } int fieldSize = RawSerializer.GetFieldSize(fieldType.GetElementType(), fieldInfo, instance); Array array2 = fieldInfo.GetValue(instance) as Array; num += 2; num += array2.Length * fieldSize; } } else if (lengthAttribute != null && fieldType == typeof(string)) { num += lengthAttribute.Length * 2; } else { num += RawSerializer.GetFieldSize(fieldType, fieldInfo, instance); } } } } return(num); }