2014-10-30 86 views
1

我有一个单元测试,请执行下列操作:日期时间序列化不同(SQL服务器VS .NET)

  1. 它创建一个类(myObject的)的一个实例。
  2. 它使用SerializeObject序列化myObject(代码如下)
  3. 它将对象发送到WCF服务,该服务将对象保留到SQL Server数据库。 (INSERT)
  4. 它resquests的WCF来获取对象(myObject2)(任选)
  5. 其序列myObject2使用SerializeObject
  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(); 
    } 
    

问题是与日期时间字段。

(从单元测试)预计:

<dateField>2015-10-30T08:04:52.6115334-04:00</dateField> 

实际(从WCF):

<dateField>2015-10-30T08:04:52.613</dateField> 

正如你所看到的,第一似乎与精度的问题。此外,单元测试的DateTime其中有-04:00。

我怎样才能让这两个日期匹配?

+0

你知道WCF为你处理所有的序列化/反序列化吗?没有必要推出自己的解决方案。 – Jamiec 2014-10-30 12:18:41

+0

@Jamiec,这是一个单位测试。我这样做是为了确保发送到WCF的对象被持久化到数据库,并在客户端返回完全相同的值。 – Baral 2014-10-30 12:33:09

+0

如果它的端到端测试就像它不是单元测试它的集成测试一样。但现在我正在分裂头发;) – Jamiec 2014-10-30 12:58:06

回答

0

我无法解决该问题。我只是将日期设置回它在c#中的值,并且它工作正常。

2

我不知道如何解决与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); } 
}