2014-10-30 2 views
1

У меня есть модульное тестирование, что сделать следующее:DateTime сериализации отличается (SQL Server против .Net)

  1. Это создает экземпляр класса (MyObject).
  2. Он сериализует myObject с помощью SerializeObject (код ниже)
  3. Он отправляет объект в службу WCF, которая сохраняется в базе данных SQL Server. (ВСТАВИТЬ)
  4. Это resquests ФОС, чтобы получить объект (myObject2) (SELECT)
  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(); 
    } 
    

Проблема в том, с поля даты и времени.

Ожидаемое (от UnitTest):

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

Actual (от WCF):

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

Как вы можете видеть, первое, кажется, проблема с точностью. Кроме того, DateTime от Unit Test имеет в нем -04: 00.

Как я могу совместить эти две даты?

+0

Вы понимаете, что WCF имеет для вас всю сериализацию/десериализацию? Нет никакой необходимости катить свое решение. – Jamiec

+0

@Jamiec, это ТЕСТ ДЛЯ УСТАНОВКИ. Я делаю это, чтобы убедиться, что объект, отправленный в WCF, сохраняется в базе данных и возвращается на стороне клиента с точно такими же значениями. – Baral

+0

Если его тестирование от конца до конца, как будто это не модуль, проверьте его интеграционный тест. Но теперь я раскалываю волосы;) – Jamiec

ответ

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); 
} 

Конечно, вы можете также обернуть его в приспособление для имущества, что является моим предпочтительным методом.

private DateTime _myDate; 
public DateTime MyDate 
{ 
    get { return _myDate; } 
    set { _myDate = DateTime.SpecifyKind(value, DateTimeKind.Unspecified); } 
} 
Смежные вопросы