В моем случае есть различные причины, которые мешают мне использовать JavaScriptSerializer .Вот некоторые из них.
1) Уродливая десериализация при работе с анонимными типами
Хотя использование для сериализации довольно простое:
JavaScriptSerializer serializer = new JavaScriptSerializer();
String json = serializer.Serialize(data);
Однако для десериализации существует небольшое раздражение в том, что десериализатор принимает универсальный тип вместе с содержимым:
serializer.Deserialize<T>(String s)
это может быть проблемой, если тип T не известен при компиляциивремя и должно быть динамичным.Обходной путь немного уродлив, как я узнал, потому что он использует отражение для создания универсального метода (но он работает)
var result = typeof(JavaScriptSerializer).GetMethod("Deserialize")
.MakeGenericMethod(JsonDataType)
.Invoke(serializer, new object[] { inputContent });
Обратите внимание : согласно комментарию Дэйва Уорда к этому ответу есть DeserializeObject()
, который может быть использован для предотвращения этого.
2) Не удается обработать циклические ссылки
Я видел это с использованием Entity Framework , Linq to SQL, NHibernate, NetTiers и даже при использовании Прокси замка .
Согласно MS Connect исключение циклической ссылки будет вызываться, когда навигационное отношение является двусторонним (может иметь доступ к обеим сторонам отношения), поэтому первое, что нужно сделать, это отключить односторона отношения.Исключение также будет выдано, когда вы используете отношения 1: 1 (или 1: 0..1 или любое отношение, вызывающее создание свойства типа EntityReference), в этом случае исключение будет иметь тип System.Data.Metadata.Edm.AssociationType
.
Решение этой проблемы - заставить сериализатор игнорировать свойства типа EntityReference, используя пустую реализацию класса, производного от JavaScriptConverter и регистрируя его с помощью метода RegisterConverters объекта JavaScriptSerializer.
3) Полезные функции, которые приводят к менее тестируемому коду
Полезная функция JavaScriptSerializer заключается в том, что вы также можете реализовать пользовательский JavaScriptConverter и передать его JavaScriptSerializer для детального контроля над сериализацией / десериализацией.,Однако, чтобы он был действительно полезным, вам нужно знать типы во время компиляции и иметь ссылки на эти типы.Это действительно ограничивает полезность этой функции, потому что, ссылаясь на эти классы, ваш код становится тесно связанным, поэтому вы не можете легко использовать его в чем-то вроде фильтра MVC.
По этим причинам я часто заканчивал тем, что использовал Json.NET.
Надеюсь, это поможет!