DateTime序列化不同(SQL Server与.Net)
本文关键字:Server Net SQL 序列化 DateTime | 更新日期: 2023-09-27 18:28:22
我有一个执行以下操作的单元测试:
- 它创建一个类(myObject)的实例
- 它使用SerializeObject序列化myObject(下面的代码)
- 它将对象发送到WCF服务,WCF服务将对象持久化到SQL Server数据库。(插入)
- 它重新请求WCF以获取对象(myObject2)(SELECT)
- 它使用SerializeObject序列化myObject2
-
它比较序列化是否相等。
public static string SerializeObject<T>(this T toSerialize) { XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType()); StringWriter textWriter = new StringWriter(); xmlSerializer.Serialize(textWriter, toSerialize); return textWriter.ToString(); }
问题出在日期时间字段上。
预期(来自UnitTest):
<dateField>2015-10-30T08:04:52.6115334-04:00</dateField>
实际(来自WCF):
<dateField>2015-10-30T08:04:52.613</dateField>
正如您所看到的,首先似乎存在精度问题。此外,单元测试的DateTime
中有-04:00。
我怎么能让这两个日期匹配?
我不知道如何用DateTime的精度来纠正这个问题。
至于-4:00
的问题,那是时区。WCF在时区方面做了一些有趣的事情(请随意研究WCF DateTime TimeZones
以获取更多信息)。因此,您可能希望转换为UTC来存储它,然后在客户端上转换回本地时间,或者您可以告诉DateTime不要指定时间类型(本地或UTC)。
后一个选项是我最熟悉的选项,下面的代码应该可以做到这一点。
public static DateTime GetUnspecifiedTime(DateTime value)
{
return DateTime.SpecifyKind(value, DateTimeKind.Unspecified);
}
当然,您也可以将它封装在属性setter中,这是我喜欢的方法。
private DateTime _myDate;
public DateTime MyDate
{
get { return _myDate; }
set { _myDate = DateTime.SpecifyKind(value, DateTimeKind.Unspecified); }
}
我无法修复该问题。我只是将日期设置回它在c#中的值,它工作得很好。