Exemple #1
0
        /// <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());
            }
        }