public override void Serialize(Stream stream, Type type, object value) { var members = GetMembers(type); for (int i = 0; i < members.Length; i++) { var member = X20Member.WrapMember(members[i], value); ctx.Serializer.Serialize_Main(stream, member.Type, member.Value); } }
public override void Deserialize(Stream stream, Type type, ref object value) { var members = GetMembers(type); for (int i = 0; i < members.Length; i++) { var member = X20Member.WrapMember(members[i], value); var memberValue = member.Value; ctx.Serializer.Deserialize_Main(stream, member.Type, ref memberValue); member.Value = memberValue; value = member.Target; // this bit is needed for structs! } }
/// <summary> /// Returns false if the field was constant (literal) while setting 'result' to null. /// Otherwise true while setting result to a new RuntimeMember wrapping the specified field /// using the appropriate method of building the [s|g]etters (delegates in case of editor/standalone, reflection otherwise) /// </summary> public static bool TryWrapField(FieldInfo field, object target, out X20Member result) { if (field.IsLiteral) { result = null; return(false); } result = new X20Member(field, field.FieldType, target); #if FAST_REFLECTION result._setter = field.DelegateForSet(); result._getter = field.DelegateForGet(); #else result._setter = field.SetValue; result._getter = field.GetValue; #endif return(true); }
/// <summary> /// Returns false if the property isn't readable or if it's an indexer, setting 'result' to null in the process. /// Otherwise true while setting result to a new RuntimeMember wrapping the specified property /// using the appropriate method of building the [s|g]etters (delegates in case of editor/standalone, reflection otherwise) /// Note that readonly properties (getter only) are fine, as the setter will just be an empty delegate doing nothing. /// </summary> public static bool TryWrapProperty(PropertyInfo property, object target, out X20Member result) { if (!property.CanRead || property.IsIndexer()) { result = null; return(false); } result = new X20Member(property, property.PropertyType, target); if (property.CanWrite) { #if FAST_REFLECTION result._setter = property.DelegateForSet(); #else result._setter = (x, y) => property.SetValue(x, y, null); #endif } #if FAST_REFLECTION else { result._setter = delegate(ref object obj, object value) { } };