Пример #1
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
                                        JsonSerializer serializer)
        {
            if (reader.TokenType != JsonToken.StartObject)
            {
                return(null);
            }

            var tracker = new TrackableSetTracker <T>();

            reader.Read();
            while (true)
            {
                if (reader.TokenType != JsonToken.PropertyName)
                {
                    break;
                }

                var str = (string)reader.Value;
                reader.Read();

                var add = (str == "+");

                if (reader.TokenType != JsonToken.StartArray)
                {
                    break;
                }
                reader.Read();

                while (reader.TokenType != JsonToken.EndArray)
                {
                    var value = serializer.Deserialize <T>(reader);
                    reader.Read();
                    if (add)
                    {
                        tracker.TrackAdd(value);
                    }
                    else
                    {
                        tracker.TrackRemove(value);
                    }
                }
                reader.Read();
            }

            return(tracker);
        }
        public static TrackableSetTracker <T> Convert(TrackableSetTrackerSurrogate <T> surrogate)
        {
            if (surrogate == null)
            {
                return(null);
            }

            var tracker = new TrackableSetTracker <T>();

            foreach (var value in surrogate.AddValues)
            {
                tracker.TrackAdd(value);
            }
            foreach (var value in surrogate.RemoveValues)
            {
                tracker.TrackRemove(value);
            }
            return(tracker);
        }
        public static TrackableSetTracker <T> Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options)
        {
            var tracker = new TrackableSetTracker <T>();
            var length  = reader.ReadArrayHeader();

            for (int i = 0; i < length; i++)
            {
                var isAdd = reader.ReadBoolean();
                var value = MessagePackSerializer.Deserialize <T>(ref reader, options);
                if (isAdd)
                {
                    tracker.TrackAdd(value);
                }
                else
                {
                    tracker.TrackRemove(value);
                }
            }

            return(tracker);
        }