У чому різниця між DataContractJsonSerializer та JavaScriptSerializer?


88

.NET Framework постачається з System.Runtime.Serialization.Json.DataContractJsonSerializer та System.Web.Script.Serialization.JavaScriptSerializer , обидва з яких де / серіалізують JSON. Як я знаю, коли вибрати один із цих типів перед іншим? MSDN не дає зрозуміти, якими є їхні відносні переваги.

У нас є кілька проектів, які споживають або випускають JSON, і клас, обраний для кожного дотепер, залежав від думки основного розробника щодо кожного проекту. Деякі з них прості, два мають складну логіку щодо створення керованих типів з JSON (типи не збігаються з потоками), але не роблять жодного акценту на швидкості, один вимагає швидкості. Жоден не взаємодіє з WCF, принаймні на сьогодні.

Хоча мене цікавлять альтернативні бібліотеки, я сподіваюся, що хтось може отримати відповідь і на моє запитання.


8
використовуйте Json.Net json.codeplex.com . Ви матимете набагато більше контролю над процесом серіалізації / десеріалізації.
LB

Залежить від того, як ви ним користуєтесь. DataContractJsonSerializer має тенденцію добре працювати з WCF. JavaScriptSerializer набагато простіший. Що ти намагаєшся робити?
jrummell

Використовуйте ServiceStack.JsonSerializer - це найшвидший. Але він не виконує атрибут [ScriptIgnore]. Не проблема, якщо вона вам не потрібна. Дивіться довгу дискусію про це тут: stackoverflow.com/questions/9150920/…
Офер Зеліг

18
Чому всі дають свої відповіді в коментарях? Важко проголосувати за відповіді чи прокоментувати їх.
Джастін Р.

3
@JustinR. можливо, через якусь тут міліцію, яка відмовилась би відповісти на один рядок і сказати: "це повинен бути коментар".
nawfal

Відповіді:


68

DataContractJsonSerializer призначений для використання з клієнтськими програмами WCF, де серіалізовані типи, як правило, є класами POCO із застосованим до них атрибутом DataContract. Немає DataContract, немає серіалізації. Механізм відображення WCF робить надсилання та отримання дуже простими, але лише в тому випадку, якщо ваша платформа однорідна. Якщо ви почнете змішувати різні набори інструментів, ваша програма може піти вбік.

JavaScriptSerializer може серіалізувати будь-який тип, включаючи анонімні типи (в один бік), і робить це більш відповідним чином. Ви втрачаєте "автоматизм" WCF, але отримуєте більше можливостей інтеграції.

Як ви можете бачити за коментарями, існує безліч варіантів серіалізації AJAX, і для вирішення питань швидкості та ремонтоздатності, можливо, варто їх дослідити, щоб знайти рішення, яке відповідає потребам усіх команд, зменшити проблеми з ремонтом у довгостроковій перспективі, оскільки кожен робить все по-своєму.

07.04.2014 ОНОВЛЕННЯ: Я пропоную використовувати JSON.NET, якщо можете. Див. Http://james.newtonking.com/json Порівняння функцій для огляду 3 бібліотек, розглянутих у цьому питанні.

2015-05-26 ОНОВЛЕННЯ: Якщо ваша компанія вимагає використання комерційно ліцензованих продуктів або вам потрібен кожен останній крок продуктивності, можливо, ви також захочете перевірити https://servicestack.net/ .


2
Які відмінності в ефективності серіалізації між ними двома? Скажімо, вони будуть серіалізувати однакову кількість сутностей з однаковою кількістю атрибутів?
Адріан Салазар

20

Обидва вони виконують приблизно однаково, але використовують дуже різну інфраструктуру, таким чином застосовуючи різні обмеження до класів, які ви хочете серіалізувати / десеріалізувати, та забезпечуючи різну ступінь гнучкості в налаштуванні процесу серіалізації / десеріалізації.

Для DataContractJsonSerializerвас потрібно позначити всі класи, які ви хочете серіалізувати, використовуючи DataContractatrtibute, і всіх членів, що використовують DataMemberатрибут. Як і якщо у деяких з класів є члени перерахування, то перелічення також повинні бути позначені як DataContractі кожен член переліку - EnumMemberатрибутом. Також DataContractJsonSerializerдозволяє вам чітко контролювати весь процес серіалізації / десеріалізації, змінюючи логіку роздільної здатності типів і замінюючи типи, які ви серіалізуєте, сурогатами.

Бо JavaScriptSerializerви повинні надати конструктор без параметрів, якщо ви плануєте десеріалізувати об'єкти з рядка json.

Для мене я зазвичай використовую JavaScriptSerializerв логіці презентацій, де існує проста модель, яку я хочу зробити в Json разом зі сторінкою, без додаткових запитів ajax. І мені навіть зазвичай не доводиться десеріалізувати їх назад до c # - тому взагалі немає накладних витрат. Але якщо це логіка постійності, де я хочу зберегти об’єкти в сховищі даних (як правило, не sql-сховище), щоб завантажити їх пізніше, я віддаю перевагу використанню, DataContractJsonSerializerоскільки накладні витрати на атрибути варті гнучкості в налаштуванні процесу серіалізації / десеріалізації, особливо коли йдеться про завантаження серіалізованих даних в об'єкти нової версії із оновленими визначеннями


2

Особисто я думаю, що це DataContractJsonSerializerпахне надмірною інженерією. Я пропустив би це і пішов би JavaScriptSerializer. У випадку, коли JavaScriptSerializerце недоступно, ви можете використовувати FridayThe13th (бібліотека, яку я написав; p).


Json.Net є скрізь. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.