Skip to content

Commit

Permalink
Fix circular reference when serializing/deserializing after registeri…
Browse files Browse the repository at this point in the history
…ng a singleton JsonSerializerSettings with the Locator (#610)

Co-authored-by: Josh Plooster <josh.plooster@polaris.com>
  • Loading branch information
jploo and Josh Plooster committed Oct 16, 2020
1 parent 7809f40 commit 113ed07
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 16 deletions.
26 changes: 18 additions & 8 deletions src/Akavache.Core/BlobCache/InMemoryBlobCache.cs
Expand Up @@ -451,10 +451,7 @@ protected virtual void Dispose(bool isDisposing)

private byte[] SerializeObject<T>(T value)
{
var settings = Locator.Current.GetService<JsonSerializerSettings>() ?? new JsonSerializerSettings();
_jsonDateTimeContractResolver.ExistingContractResolver = settings.ContractResolver;
settings.ContractResolver = _jsonDateTimeContractResolver;
var serializer = JsonSerializer.Create(settings);
var serializer = GetSerializer();
using (var ms = new MemoryStream())
{
using (var writer = new BsonDataWriter(ms))
Expand All @@ -467,10 +464,7 @@ private byte[] SerializeObject<T>(T value)

private T DeserializeObject<T>(byte[] data)
{
var settings = Locator.Current.GetService<JsonSerializerSettings>() ?? new JsonSerializerSettings();
_jsonDateTimeContractResolver.ExistingContractResolver = settings.ContractResolver;
settings.ContractResolver = _jsonDateTimeContractResolver;
var serializer = JsonSerializer.Create(settings);
var serializer = GetSerializer();
using (var reader = new BsonDataReader(new MemoryStream(data)))
{
var forcedDateTimeKind = BlobCache.ForcedDateTimeKind;
Expand All @@ -492,5 +486,21 @@ private T DeserializeObject<T>(byte[] data)
return serializer.Deserialize<T>(reader);
}
}

private JsonSerializer GetSerializer()
{
var settings = Locator.Current.GetService<JsonSerializerSettings>() ?? new JsonSerializerSettings();
JsonSerializer serializer;

lock (settings)
{
_jsonDateTimeContractResolver.ExistingContractResolver = settings.ContractResolver;
settings.ContractResolver = _jsonDateTimeContractResolver;
serializer = JsonSerializer.Create(settings);
settings.ContractResolver = _jsonDateTimeContractResolver.ExistingContractResolver;
}

return serializer;
}
}
}
26 changes: 18 additions & 8 deletions src/Akavache.Sqlite3/SqlLiteCache/SqlRawPersistentBlobCache.cs
Expand Up @@ -681,10 +681,7 @@ protected virtual IObservable<byte[]> AfterReadFromDiskFilter(byte[] data, ISche

private byte[] SerializeObject<T>(T value)
{
var settings = Locator.Current.GetService<JsonSerializerSettings>() ?? new JsonSerializerSettings();
_jsonDateTimeContractResolver.ExistingContractResolver = settings.ContractResolver;
settings.ContractResolver = _jsonDateTimeContractResolver;
var serializer = JsonSerializer.Create(settings);
var serializer = GetSerializer();
using (var ms = new MemoryStream())
{
using (var writer = new BsonDataWriter(ms))
Expand All @@ -697,10 +694,7 @@ private byte[] SerializeObject<T>(T value)

private IObservable<T> DeserializeObject<T>(byte[] data)
{
var settings = Locator.Current.GetService<JsonSerializerSettings>() ?? new JsonSerializerSettings();
_jsonDateTimeContractResolver.ExistingContractResolver = settings.ContractResolver;
settings.ContractResolver = _jsonDateTimeContractResolver;
var serializer = JsonSerializer.Create(settings);
var serializer = GetSerializer();
using (var reader = new BsonDataReader(new MemoryStream(data)))
{
var forcedDateTimeKind = BlobCache.ForcedDateTimeKind;
Expand Down Expand Up @@ -731,5 +725,21 @@ private IObservable<T> DeserializeObject<T>(byte[] data)
}
}
}

private JsonSerializer GetSerializer()
{
var settings = Locator.Current.GetService<JsonSerializerSettings>() ?? new JsonSerializerSettings();
JsonSerializer serializer;

lock (settings)
{
_jsonDateTimeContractResolver.ExistingContractResolver = settings.ContractResolver;
settings.ContractResolver = _jsonDateTimeContractResolver;
serializer = JsonSerializer.Create(settings);
settings.ContractResolver = _jsonDateTimeContractResolver.ExistingContractResolver;
}

return serializer;
}
}
}

0 comments on commit 113ed07

Please sign in to comment.