Serialization Akavache未存储/返回节点时间LocalDateTime

Serialization Akavache未存储/返回节点时间LocalDateTime,serialization,nodatime,akavache,Serialization,Nodatime,Akavache,我需要在Akavache缓存中存储一个NodeTime LocalDateTime 我创建了一个简单的应用程序,它接受以下类并在Akavache缓存中存储/检索它: public class TestModel { public string Name { get; set; } public LocalDateTime StartDateTimeLocal {get; set;} public DateTime StartDateTimeUtc

我需要在Akavache缓存中存储一个NodeTime LocalDateTime

我创建了一个简单的应用程序,它接受以下类并在Akavache缓存中存储/检索它:

public class TestModel
{
        public string Name { get; set; }
        public LocalDateTime StartDateTimeLocal {get; set;}
        public DateTime StartDateTimeUtc {get;set;}
}
当它存储在缓存中并从缓存中检索时,StartDateTimeLocal属性尚未填充

Akavache似乎不知道如何序列化/反序列化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");
        }
    }
}

我在一个控制台应用程序中添加了一个与上述内容相关的示例,演示了这个问题。

您需要配置Akavache在Json.NET中使用的
JsonSerializerSettings
。您需要一个对
NodaTime.Serialization.JsonNet
的引用,此时您可以创建一个序列化程序设置实例,为Noda时间配置它,然后将其作为依赖项添加到Splat中(Akavache使用)。我以前没有使用过Splat,因此这可能不是正确的方法,但它适用于您的示例:

使用Newtonsoft.Json;
使用NodaTime.Serialization.JsonNet;
使用Splat;
...
//这应该在任何其他代码之前。
var settings=new JsonSerializerSettings();
settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
Locator.CurrentMutable.RegisterConstant(设置、类型(JsonSerializerSettings));

可能值得在Akavache repo中申请更多用于定制序列化设置的文档,但上面的工作是猜测和一点源代码调查。

您需要配置Akavache与Json.NET一起使用的
JsonSerializerSettings
。您需要一个对
NodaTime.Serialization.JsonNet
的引用,此时您可以创建一个序列化程序设置实例,为Noda时间配置它,然后将其作为依赖项添加到Splat中(Akavache使用)。我以前没有使用过Splat,因此这可能不是正确的方法,但它适用于您的示例:

使用Newtonsoft.Json;
使用NodaTime.Serialization.JsonNet;
使用Splat;
...
//这应该在任何其他代码之前。
var settings=new JsonSerializerSettings();
settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
Locator.CurrentMutable.RegisterConstant(设置、类型(JsonSerializerSettings));

可能值得在Akavache repo中提交争议文件,以要求提供更多用于定制序列化设置的文档-上述方法可行,但只是猜测和一点源代码调查。

您是否可以编写一个我们可以用来探索这一点的文档?我自己根本没有使用过阿卡瓦什,但如果可能的话,我会有兴趣尝试解决这个问题。该网站建议它可以使用Json.NET,因此在Json.NET中添加节点时间的序列化程序设置可能会对其进行排序。但我不希望完全从头开始——这是一个完整的示例(带有内存缓存)真正有帮助的地方。今天上午我将尝试组合一个示例。Repo添加了一个示例,演示了这个问题(请参阅主帖子)。我认为最好将该代码放在问题本身中—它足够小。(请注意,保持链接对于git克隆也很有用。)好主意-完成!你能不能写一篇文章,我们可以用它来探讨这个问题?我自己根本没有使用过阿卡瓦什,但如果可能的话,我会有兴趣尝试解决这个问题。该网站建议它可以使用Json.NET,因此在Json.NET中添加节点时间的序列化程序设置可能会对其进行排序。但我不希望完全从头开始——这是一个完整的示例(带有内存缓存)真正有帮助的地方。今天上午我将尝试组合一个示例。Repo添加了一个示例,演示了这个问题(请参阅主帖子)。我认为最好将该代码放在问题本身中—它足够小。(请注意,保持链接对于git克隆也很有用。)好主意-完成!谢谢-那正是我想要的。我以为解决办法是这样的,但不知道如何把它结合起来。我将发布一期Akavache,要求提供更清晰的序列化文档。谢谢-这正是我想要的。我以为解决办法是这样的,但不知道如何把它结合起来。我将发布一个Akavache问题,要求提供更清晰的序列化文档。
using NodaTime;
using System;

namespace AkavacheNodaTimeCore
{
    public class TestModel
    {
        public string Name { get; set; }
        public LocalDateTime StartLocalDateTime { get; set; }
        public DateTime StartDateTime {get;set;}

    }
}