Сериализация.NET DateTime в строку Json

Я пишу собственный сериализатор Json, чтобы улучшить работу моего сервиса. И да, я принимал во внимание Json.NET, сервисный стек, DataContractJsonSerializer и т. Д. До того, как принял решение. Мои объекты плоские с простыми типами.NET, и я хотел избежать накладных расходов гораздо большей библиотеки.

В любом случае, здесь я столкнулся с небольшой проблемой. У меня есть код для сериализации DateTime -

    var epoch = new DateTime(1970, 1, 1, 0, 0, 0);
    sb.Append("\"\\/Date(");
    SerializeNumber((time - epoch).TotalMilliseconds, sb);
    sb.Append(")\\/\"");

И это прекрасно работает, за исключением того, что я не могу заставить его соответствовать стандартному сериализатору.NET Json в выводе.

.NET serializer 
"\\/Date(1328057884253)\\/\"
Custom serializer
"\\/Date(1328057884253.04)\\/\"

Хм, поэтому я попытался сделать свое преобразование менее точным и перейти на (int)TotalSeconds вместо миллисекунд, и это дает мне это -

.NET serializer
"\\/Date(1328054810067)\\/\"
Custom serializer
"\\/Date(1328054810)\\/\"

Я предполагаю, что это не будет большой проблемой, но было бы неплохо, чтобы мои модульные тесты проходили против стандартного сериализатора.NET только для здравого смысла. Есть идеи?

Благодарю.

2 ответа

Решение

Свойство TotalMilliseconds имеет тип double. Вы можете просто преобразовать его в long вместо использования метода TotalSeconds, который, конечно, не возвращает одно и то же значение...

var epoch = new DateTime(1970, 1, 1, 0, 0, 0);
sb.Append("\"\\/Date(");
SerializeNumber((long)(time - epoch).TotalMilliseconds, sb);
sb.Append(")\\/\"");

edit: как сказал Кош в комментариях, предпочитайте long int, чтобы избежать переполнения емкости.

Не могли бы вы просто усечь результат?

Math.Truncate((time - epoch).TotalMilliseconds)

http://msdn.microsoft.com/de-de/library/c2eabd70.aspx

или, может быть, лучше вокруг. не знаю, что сделает JsonSerializer.

Math.Round((time - epoch).TotalMilliseconds, 0)

http://msdn.microsoft.com/de-de/library/75ks3aby.aspx

Другие вопросы по тегам