В чем разница между 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, и для решения вопросов скорости и удобства обслуживания, возможно, стоит изучить их, чтобы найти решение, отвечающее потребностям всех команд, чтобы уменьшить проблемы с ремонтопригодностью в долгосрочной перспективе, поскольку каждый делает все по-своему.

2014-04-07 ОБНОВЛЕНИЕ: я предлагаю использовать JSON.NET, если можете. См. Http://james.newtonking.com/json Feature Comparison для обзора трех библиотек, рассмотренных в этом вопросе.

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).

JP Ричардсон
источник
Json.Net везде. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB