Сериализация.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)