Akavache 不是 storing/returning 一个 NodaTime LocalDateTime
Akavache not storing/returning a NodaTime LocalDateTime
我需要在 Akavache 缓存中存储一个 NodaTime LocalDateTime。
我创建了一个简单的应用程序,它采用以下 class 和 stores/retrieves 它 in/from 一个 Akavache 缓存:
public class TestModel
{
public string Name { get; set; }
public LocalDateTime StartDateTimeLocal {get; set;}
public DateTime StartDateTimeUtc {get;set;}
}
当它存储在缓存中并从缓存中检索时,StartDateTimeLocal 属性 尚未填充。
Akavache 似乎不知道如何 serialise/deserialize LocalDateTime。
是否可以使用 Akavache 注册类型或为未知类型提供自定义序列化?
用于演示的控制台应用程序:
using Akavache;
using NodaTime;
using System;
using System.Reactive.Linq;
namespace AkavacheNodaTimeCore
{
class Program
{
static TestModel BeforeModel;
static TestModel AfterModel;
static void Main(string[] args)
{
// Note that we're using Akavache 6.0.27, to match the version we're using in our live system.
BlobCache.ApplicationName = "AkavacheNodaTimeCore";
BlobCache.EnsureInitialized();
BeforeModel = new TestModel()
{
StartLocalDateTime = LocalDateTime.FromDateTime(DateTime.Now),
StartDateTime = DateTime.UtcNow,
};
Console.WriteLine($"Before:LocalDateTime='{BeforeModel.StartLocalDateTime}' DateTime='{BeforeModel.StartDateTime}'");
CycleTheModels();
Console.WriteLine($"After: LocalDateTime='{AfterModel.StartLocalDateTime}' DateTime='{AfterModel.StartDateTime}'");
Console.WriteLine("Note that Akavache retrieves DateTimes as DateTimeKind.Local, so DateTime before and after above will differ.");
Console.WriteLine("Press any key to continue.");
var y = Console.ReadKey();
}
/// <summary>
/// Puts a model into Akavache and retrieves a new one so we can compare.
/// </summary>
static async void CycleTheModels()
{
await BlobCache.InMemory.Invalidate("model");
await BlobCache.InMemory.InsertObject("model", BeforeModel);
AfterModel = await BlobCache.InMemory.GetObject<TestModel>("model");
}
}
}
测试模型class:
using NodaTime;
using System;
namespace AkavacheNodaTimeCore
{
public class TestModel
{
public string Name { get; set; }
public LocalDateTime StartLocalDateTime { get; set; }
public DateTime StartDateTime {get;set;}
}
}
我在控制台应用程序中添加了一个 Git repo 来演示问题。
您需要配置 Akavache 使用的 JsonSerializerSettings
和 Json.NET。您需要引用 NodaTime.Serialization.JsonNet
,此时您可以创建序列化程序设置实例,为 Noda Time 配置它,然后将其添加为 Splat(Akavache 使用)中的依赖项。我以前没有使用过 Splat,所以这可能不是正确的做法,但它适用于您的示例:
using Newtonsoft.Json;
using NodaTime.Serialization.JsonNet;
using Splat;
...
// This should be before any of your other code.
var settings = new JsonSerializerSettings();
settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
Locator.CurrentMutable.RegisterConstant(settings, typeof(JsonSerializerSettings));
可能值得在 Akavache 存储库中提交问题以请求更多文档以自定义序列化设置 - 上述工作有效,但只是猜测和一些源代码调查。
我需要在 Akavache 缓存中存储一个 NodaTime LocalDateTime。
我创建了一个简单的应用程序,它采用以下 class 和 stores/retrieves 它 in/from 一个 Akavache 缓存:
public class TestModel
{
public string Name { get; set; }
public LocalDateTime StartDateTimeLocal {get; set;}
public DateTime StartDateTimeUtc {get;set;}
}
当它存储在缓存中并从缓存中检索时,StartDateTimeLocal 属性 尚未填充。
Akavache 似乎不知道如何 serialise/deserialize LocalDateTime。
是否可以使用 Akavache 注册类型或为未知类型提供自定义序列化?
用于演示的控制台应用程序:
using Akavache;
using NodaTime;
using System;
using System.Reactive.Linq;
namespace AkavacheNodaTimeCore
{
class Program
{
static TestModel BeforeModel;
static TestModel AfterModel;
static void Main(string[] args)
{
// Note that we're using Akavache 6.0.27, to match the version we're using in our live system.
BlobCache.ApplicationName = "AkavacheNodaTimeCore";
BlobCache.EnsureInitialized();
BeforeModel = new TestModel()
{
StartLocalDateTime = LocalDateTime.FromDateTime(DateTime.Now),
StartDateTime = DateTime.UtcNow,
};
Console.WriteLine($"Before:LocalDateTime='{BeforeModel.StartLocalDateTime}' DateTime='{BeforeModel.StartDateTime}'");
CycleTheModels();
Console.WriteLine($"After: LocalDateTime='{AfterModel.StartLocalDateTime}' DateTime='{AfterModel.StartDateTime}'");
Console.WriteLine("Note that Akavache retrieves DateTimes as DateTimeKind.Local, so DateTime before and after above will differ.");
Console.WriteLine("Press any key to continue.");
var y = Console.ReadKey();
}
/// <summary>
/// Puts a model into Akavache and retrieves a new one so we can compare.
/// </summary>
static async void CycleTheModels()
{
await BlobCache.InMemory.Invalidate("model");
await BlobCache.InMemory.InsertObject("model", BeforeModel);
AfterModel = await BlobCache.InMemory.GetObject<TestModel>("model");
}
}
}
测试模型class:
using NodaTime;
using System;
namespace AkavacheNodaTimeCore
{
public class TestModel
{
public string Name { get; set; }
public LocalDateTime StartLocalDateTime { get; set; }
public DateTime StartDateTime {get;set;}
}
}
我在控制台应用程序中添加了一个 Git repo 来演示问题。
您需要配置 Akavache 使用的 JsonSerializerSettings
和 Json.NET。您需要引用 NodaTime.Serialization.JsonNet
,此时您可以创建序列化程序设置实例,为 Noda Time 配置它,然后将其添加为 Splat(Akavache 使用)中的依赖项。我以前没有使用过 Splat,所以这可能不是正确的做法,但它适用于您的示例:
using Newtonsoft.Json;
using NodaTime.Serialization.JsonNet;
using Splat;
...
// This should be before any of your other code.
var settings = new JsonSerializerSettings();
settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
Locator.CurrentMutable.RegisterConstant(settings, typeof(JsonSerializerSettings));
可能值得在 Akavache 存储库中提交问题以请求更多文档以自定义序列化设置 - 上述工作有效,但只是猜测和一些源代码调查。