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; } }
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); }