ServiceStack - 如何在不覆盖全局默认值的情况下反序列化每个请求可能采用多种格式的 DateTime

ServiceStack - How to Deserialize DateTime which could be in multiple formats per each request without overriding global defaults

我有一些全局默认值

JsConfig.DateHandler = DateHandler.ISO8601;
JsConfig.AlwaysUseUtc = true;
JsConfig.AssumeUtc = true;

我正在阅读 CsvFiles,它具有多种格式的日期字段,并且不受全局默认设置的支持。我已经通过以下代码解决了这个问题

var fn = JsConfig<DateTime?>.DeSerializeFn;
try
{
    using (var fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
        var formats = new[]
        {
            "dd/MM/yyyy HH:mm:ss tt", "yyyy-MM-dd HH:mm:ss"
        };

        JsConfig<DateTime?>.DeSerializeFn = str =>
        {
            if (str == null) return null;
            return DateTime.ParseExact(str, formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
        };

        return CsvSerializer.DeserializeFromStream<List<T>>(fs);
    }
}
catch (Exception ex)
{
    throw new FileLoadException(ex.Message);
}
finally
{
    JsConfig<DateTime?>.DeSerializeFn = fn;
}

现在我遇到的问题是,当解析器位于第 2 行且就在最后一行之前时,这会在其他任何地方破坏应用程序。这是因为我获取了原始设置,根据需要进行更改,然后在最后将其更改回来。 JsConfig.With 不起作用,因为它们不是 DateTimeFormat 数组 属性,我还能做什么?我难住了!

您不能"temporarily"更改任何类型的序列化实现,即您注册的任何自定义实现此后都必须保持不变。

要么您的自定义实现需要支持您要使用的每种格式,将其反序列化为 string,这样您就可以在反序列化后将您自己的自定义实现应用于原始字符串,或者您需要使用使用自定义实现的不同序列化程序。