示例#1
0
        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());
                }
            }
        }