DateTime序列化不同(SQL Server与.Net)

本文关键字:Server Net SQL 序列化 DateTime | 更新日期: 2023-09-27 18:28:22

我有一个执行以下操作的单元测试:

  1. 它创建一个类(myObject)的实例
  2. 它使用SerializeObject序列化myObject(下面的代码)
  3. 它将对象发送到WCF服务,WCF服务将对象持久化到SQL Server数据库。(插入)
  4. 它重新请求WCF以获取对象(myObject2)(SELECT)
  5. 它使用SerializeObject序列化myObject2
  6. 它比较序列化是否相等。

    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序列化不同(SQL Server与.Net)

我不知道如何用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#中的值,它工作得很好。