public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var data         = JToken.Load(reader);
            var migratedData = DataMigrator.TryMigrate(data, objectType, serializer);

            try
            {
                _MigratedTypes.Value[objectType] = true;
                using (var dataReader = migratedData.Item1.CreateReader())
                {
                    if (existingValue != null && serializer.ObjectCreationHandling != ObjectCreationHandling.Replace)
                    {
                        serializer.Populate(dataReader, existingValue);
                        return(existingValue);
                    }
                    return(serializer.Deserialize(dataReader, objectType));
                }
            }
            finally
            {
                _MigratedTypes.Value[objectType] = false;
            }
        }
示例#2
0
        public Tuple <JToken, bool> TryMigrate(JToken serializedData, Type unserializedDataType, JsonSerializer serializer)
        {
            var migratedData = _Inner.TryMigrate(serializedData, unserializedDataType, serializer);

            if (!IsVerifying)
            {
                try
                {
                    // Only verify if a migration took place.
                    // Otherwise assume the data is ok ( verification is slow )
                    if (migratedData.Item2)
                    {
                        IsVerifying = true;
                        VerifyMigration(migratedData.Item1, unserializedDataType, serializer);
                    }
                }
                finally
                {
                    IsVerifying = false;
                }
            }
            return(migratedData);
        }