2012-02-01 3 views
1

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

В любом случае, здесь я столкнулся с небольшой проблемой. У меня есть код сериализации 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)\\/\" 

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

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

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

Спасибо.

+0

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

+0

С учетом servicestack.text у вас были контрольные показатели, что он был слишком медленным? или был ли 120-килограммовый бесплатный .dll слишком большой? – mythz

+0

сервисная служба не была медленной, это было не приемлемым решением для нашего клиента по разным причинам. Обратите внимание, что я только сериализую события, которые довольно тривиальны, по сравнению с десериализацией, которая является зверем. Мой локальный профайлер показывает улучшение 4.x% по сравнению с стандартным сериализатором .NET при использовании моего обработчика с ручной обработкой. – kosh

ответ

2

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

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

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

+0

, я должен был бросить его долго, чтобы избежать переполнения, но это сделало это. – kosh

Смежные вопросы