/// <summary> /// Serializes a class instance to binary /// </summary> /// <typeparam name="T">The class type to serialize</typeparam> /// <param name="instance">The instance to serialize</param> /// <returns>Binary serialized version of the instance</returns> public static byte[] Serialize <T>(T instance) { FieldInfo[] sortedFields; MethodInfo preMethod; if (cachedFields.ContainsKey(instance.GetType().FullName)) { sortedFields = cachedFields[instance.GetType().FullName]; } else { sortedFields = instance.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).OrderBy(x => x.Name).Where(x => !x.IsDefined(typeof(BinaryIgnore), true)).ToArray(); cachedFields.Add(instance.GetType().FullName, sortedFields); } if (preSerialize.ContainsKey(instance.GetType().FullName)) { preMethod = preSerialize[instance.GetType().FullName]; } else { preMethod = instance.GetType().GetMethod("PreSerialize", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); preSerialize.Add(instance.GetType().FullName, preMethod); } if (preMethod != null) { preMethod.Invoke(instance, null); } using (BitWriter writer = BitWriter.Get()) { for (int i = 0; i < sortedFields.Length; i++) { FieldTypeHelper.WriteFieldType(writer, sortedFields[i].GetValue(instance)); } return(writer.Finalize()); } }