/// <summary> /// Provides the actual implementation for serializing a value of type <see cref="T" />. /// </summary> /// <param name="value">The value to serialize.</param> /// <param name="writer">The writer to serialize with.</param> protected override void SerializeImplementation(ref T value, IDataWriter writer) { var members = FormatterUtilities.GetSerializableMembers(typeof(T), this.OverridePolicy ?? writer.Context.Config.SerializationPolicy); for (int i = 0; i < members.Length; i++) { var member = members[i]; Type type; var memberValue = FormatterUtilities.GetMemberValue(member, value); if (object.ReferenceEquals(memberValue, null)) { type = FormatterUtilities.GetContainedType(member); } else { type = memberValue.GetType(); } var serializer = Serializer.Get(type); try { serializer.WriteValueWeak(member.Name, memberValue, writer); } catch (Exception ex) { writer.Context.Config.DebugContext.LogException(ex); } } }