public static void Serialize(ref MessagePackWriter writer, IPocoTracker <T> value, MessagePackSerializerOptions options) { var tracker = (TrackablePocoTracker <T>)value; writer.WriteArrayHeader(tracker.ChangeMap.Count); foreach (var item in tracker.ChangeMap) { writer.Write(item.Key.Name); } foreach (var item in tracker.ChangeMap) { if (item.Value.NewValue == null) { writer.WriteNil(); } else { var method = SerializeMethodCache.GetSerializeMethod(item.Value.NewValue.GetType()); var stream = new MemoryStream(10); method.Invoke(null, new object[] { stream, item.Value.NewValue, options, null }); writer.Write(stream.ToArray()); } } }
public void Serialize(ref MessagePackWriter writer, T value, MessagePackSerializerOptions options) { var properties = new List <Changed>(); foreach (var pi in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public)) { if (typeof(ITracker).IsAssignableFrom(pi.PropertyType) == false) { continue; } var subTracker = (ITracker)pi.GetValue(value, null); if (subTracker != null && subTracker.HasChange) { properties.Add(new Changed(pi.Name, subTracker)); } } writer.WriteArrayHeader(properties.Count); foreach (var pi in properties) { writer.Write(pi.PropertyName); } foreach (var pi in properties) { if (pi.Value == null) { writer.WriteNil(); } else { var type = pi.Value.GetType(); var method = SerializeMethodCache.GetSerializeMethod(type); var stream = new MemoryStream(10); method.Invoke(null, new object[] { stream, pi.Value, options, null }); writer.Write(stream.ToArray()); } } }