我有一些全局默认值
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数组属性,我还能做什么?我很沮丧!
您不能“临时”更改任何类型的序列化实现,即此后注册的任何自定义实现必须保持不变。
您的自定义实现需要支持要使用的每种格式,更改为反序列化为,string
以便您可以在反序列化原始字符串后将自己的自定义实现应用于原始字符串,或者您需要使用其他序列化程序来使用自定义实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句