В чем разница между DataContractJsonSerializer и JavaScriptSerializer? - PullRequest
84 голосов
/ 16 февраля 2012

.NET Framework поставляется с System.Runtime.Serialization.Json.DataContractJsonSerializer и System.Web.Script.Serialization.JavaScriptSerializer , оба из которых де-сериализуют JSON. Как узнать, когда выбрать один из этих типов над другим? MSDN не дает понять, каковы их относительные преимущества.

У нас есть несколько проектов, которые используют или испускают JSON, и класс, выбранный для каждого из них, до сих пор зависел от мнения первичного разработчика по каждому проекту. Некоторые из них просты, у двух сложная логика в отношении создания управляемых типов из JSON (типы не отображаются близко к потокам), но не имеют никакого значения для скорости, для одного требуется скорость. Никто не взаимодействует с WCF, по крайней мере, на данный момент.

Хотя я заинтересован в альтернативных библиотеках, я надеюсь, что у кого-то тоже может быть ответ на мой вопрос.

Ответы [ 3 ]

66 голосов
/ 23 февраля 2012

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

JavaScriptSerializer может сериализовать любой тип, включая анонимные типы (в одну сторону), и делает это более согласованным способом. Вы теряете «автоматику» WCF, но получаете больше возможностей для интеграции.

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

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

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

20 голосов
/ 27 февраля 2012

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

Для DataContractJsonSerializerВы должны пометить все классы, которые вы хотите сериализовать, используя DataContract atrtibute, и все члены, используя атрибут DataMember.Если у некоторых из вас есть члены перечисления, перечисления также должны быть помечены как DataContract, а каждый член перечисления - с атрибутом EnumMember.Также DataContractJsonSerializer позволяет вам точно контролировать весь процесс сериализации / десериализации, изменяя логику разрешения типов и заменяя типы, которые вы сериализуете, суррогатами.

Для JavaScriptSerializer вы должны предоставить конструктор без параметров, если вы планируете десериализациюобъекты из строки json.

Для меня я обычно использую JavaScriptSerializer в логике представления, где есть простая модель, которую я хочу визуализировать в Json вместе со страницей, без дополнительных запросов ajax.И мне даже обычно не нужно десериализовать их обратно в c # - так что никаких накладных расходов вообще нет.Но если это логика персистентности, когда я хочу сохранить объекты в хранилище данных (обычно в хранилище без SQL), чтобы загрузить их позже, я предпочитаю использовать DataContractJsonSerializer, поскольку накладные расходы на размещение атрибутов стоят гибкости при сериализации / десериализациинастройка процесса, особенно когда речь идет о загрузке сериализованных данных в объекты более новой версии с обновленными определениями

2 голосов
/ 16 февраля 2012

Лично я думаю, что DataContractJsonSerializer пахнет чрезмерной инженерией.Я бы пропустил это и пошел бы с JavaScriptSerializer.Если JavaScriptSerializer недоступен, вы можете использовать FridayThe13th (библиотека, которую я написал; p).

...