我有一个 .Net Maui 混合项目,它调用返回 XML 的 API。 API 返回 xml,我使用下面的代码反序列化为对象:
var serializer = new XmlSerializer(typeof(List<FullQuoteResponseModel>));
var annuityIncomes = (List<FullQuoteResponseModel>)serializer.Deserialize(new StringReader(xml));
当我在 Windows 中运行时,它可以正常工作,但是当我部署到 Android 时,反序列化失败并出现以下错误:字符串“28-05-2024”未被识别为有效的日期时间。
xml 中的日期如下所示:
<expiry_date>28-04-2024</expiry_date>
在我的对象中,我有要处理的序列化属性,如下所示,该属性在 Windows 中工作,但在 Android 中失败
[XmlIgnore]
public DateTime? ExpiryDate { get; set; }
[XmlElement("expiry_date", IsNullable = true)]
public string ExpiryDateString
{
get
{
DateTime? expiryDate = this.ExpiryDate;
ref DateTime? local = ref expiryDate;
return !local.HasValue ? (string) null : local.GetValueOrDefault().ToString("dd-MM-yyyy");
}
set
{
this.ExpiryDate = value == null ? new DateTime?() : new DateTime?(DateTime.Parse(value));
}
}
为什么这在 Android 中失败,而现在在 Windows 中失败?
我自己找到了答案,Jason 对 local 的评论引导我找到了答案。 在 Windows 中,不设置本地不会影响反序列化,并且英国格式 dd-MM-yyyy 的日期仍然有效(不知道为什么)。
但是,在 Android 中,响应中英国格式日期的反序列化导致了以下错误,据我了解,即它对于默认文化(en-US
)来说是无效的日期格式字符串“28-05-2024”未被识别为有效的日期时间
为了解决此问题,我在 Android 平台的 MainActivity.cs 中将当前区域性更改为 en-GB,如下所示:
private void SetLocale()
{
CultureInfo ci = new CultureInfo("en-GB");
CultureInfo.DefaultThreadCurrentCulture = ci;
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
}
反序列化现在将日期选择为正确的格式。希望这对某人有帮助