Вот, кажется, улучшенная версия от ответа Томаса. Работает как шарм. Мы могли бы также добавить проверку атрибута ScriptIgnore, но, тем не менее, вырубить себя.
Кстати, я выбрал JavaScriptSerializer, потому что, по моему мнению, решения сторонних производителей чаще всего бывают: менее известны, долго устанавливаются, часто забывают о предварительных требованиях и имеют размытые состояния авторского права, что делает их рискованными для распространения в бизнесе.
П-С: Я не понял, почему мы пытались десериализовать и экземпляр, и экземпляр как словарь, поэтому я удалил эту часть.
public class KeyValuePairJsonConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> deserializedJSObjectDictionary, Type targetType, JavaScriptSerializer javaScriptSerializer)
{
Object targetTypeInstance = Activator.CreateInstance(targetType);
FieldInfo[] targetTypeFields = targetType.GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (FieldInfo fieldInfo in targetTypeFields)
fieldInfo.SetValue(targetTypeInstance, deserializedJSObjectDictionary[fieldInfo.Name]);
return targetTypeInstance;
}
public override IDictionary<string, object> Serialize(Object objectToSerialize, JavaScriptSerializer javaScriptSerializer)
{
IDictionary<string, object> serializedObjectDictionary = new Dictionary<string, object>();
FieldInfo[] objectToSerializeTypeFields = objectToSerialize.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (FieldInfo fieldInfo in objectToSerializeTypeFields)
serializedObjectDictionary.Add(fieldInfo.Name, fieldInfo.GetValue(objectToSerialize));
return serializedObjectDictionary;
}
public override IEnumerable<Type> SupportedTypes
{
get
{
return new ReadOnlyCollection<Type>(new Type[] { typeof(YOURCLASSNAME) });
}
}
}