.NET Framework поставляется с System.Runtime.Serialization.Json.DataContractJsonSerializer и System.Web.Script.Serialization.JavaScriptSerializer , оба из которых де / сериализуют JSON. Как мне узнать, когда лучше выбрать один из этих типов? MSDN не дает понять, каковы их относительные преимущества.
У нас есть несколько проектов, которые используют или испускают JSON, и класс, выбранный для каждого из них, до сих пор зависел от мнения основного разработчика по каждому проекту. Некоторые из них просты, два имеют сложную логику создания управляемых типов из JSON (типы не соответствуют потокам), но не имеют никакого акцента на скорости, для одного требуется скорость. Никто не взаимодействует с WCF, по крайней мере, на данный момент.
Хотя меня интересуют альтернативные библиотеки, я надеюсь, что у кого-то тоже есть ответ на мой вопрос.
источник
Ответы:
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/ .
источник
Оба делают примерно одно и то же, но используют очень разную инфраструктуру, таким образом применяя разные ограничения для классов, которые вы хотите сериализовать / десериализовать, и обеспечивая разную степень гибкости в настройке процесса сериализации / десериализации.
Поскольку
DataContractJsonSerializer
вы должны отметить все классы, которые хотите сериализовать, используяDataContract
atrtibute, и все члены, использующиеDataMember
атрибут. Так же, как если некоторые из ваших классов имеют члены перечисления, перечисления также должны быть помечены как,DataContract
а каждый член перечисления - сEnumMember
атрибутом. ТакжеDataContractJsonSerializer
позволяет точно контролировать весь процесс сериализации / десериализации, изменяя логику разрешения типов и заменяя типы, которые вы сериализуете, суррогатами.Поскольку
JavaScriptSerializer
вы должны предоставить конструктор без параметров, если вы планируете десериализацию объектов из строки json.Что касается меня, я обычно использую
JavaScriptSerializer
логику представления, где есть простая модель, которую я хочу отобразить в Json вместе со страницей, без дополнительных запросов ajax. И мне даже обычно не нужно десериализовать их обратно на C # - так что нет никаких накладных расходов. Но если это логика постоянства, когда я хочу сохранять объекты в хранилище данных (обычно хранилище без sql), чтобы загрузить их позже, я предпочитаю использовать,DataContractJsonSerializer
потому что накладные расходы на размещение атрибутов стоят гибкости при настройке процесса сериализации / десериализации, особенно когда речь идет о загрузке сериализованных данных в объекты новой версии с обновленными определениямиисточник
Лично я думаю, что это
DataContractJsonSerializer
пахнет чрезмерной инженерией. Я бы пропустил его и пошел сJavaScriptSerializer
. В случае, еслиJavaScriptSerializer
недоступно, вы можете использовать FridayThe13th (библиотека, которую я написал; p).источник