У меня есть проблема (се) сериализации DynamicObject с другой библиотекой json, которая является не Newtownsoft.Json. (Jil, NetJSON, ServiceStack.Text ...)(De) Сериализовать DynamicObject с Jil?
Это мой расширяемый класс объекта:
public class ExpandableObject : DynamicObject
{
private readonly Dictionary<string, object> _fields = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
[JsonIgnore]
public Dictionary<string, object> Extra { get { return _fields; } }
public override IEnumerable<string> GetDynamicMemberNames()
{
var membersNames = GetType().GetProperties().Where(propInfo => propInfo.CustomAttributes
.All(ca => ca.AttributeType != typeof (JsonIgnoreAttribute)))
.Select(propInfo => propInfo.Name);
return Extra.Keys.Union(membersNames);
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return _fields.TryGetValue(binder.Name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_fields[binder.Name] = value;
return true;
}
}
Проблема с другими библиотеками (например, Джил), что переопределенные методы не вызываются. С Newtonsoft.Json он работает просто отлично, но производительность плоха.
Например - Deserialize испытание производного класса:
public class Person : ExpandableObject
{
public int Id { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
var json = "{ \"Id\": 12 , \"SomeFiled\" : \"hello\" }";
var person = Jil.JSON.Deserialize<Person>(json);
}
}
Там не является исключением .. Он просто игнорировал "SomeFiled" поле (должно быть в "Экстра")
1.There является любое решение?
2. И почему Newtonsoft.Json способен выполнять операцию и JIL не может? (или другую быструю библиотеку ...). Я понял, что переопределенные методы должны вызывать DLR .. как я могу заставить его работать?
Спасибо.
EDIT:
Сейчас я использую DeserilizeDynamic вместо десериализации (T). Теперь он работает, и мои методы вызывают DLR. Единственная проблема на данный момент - DeserilizeDynamic возвращает «dynamic» и не имеет общего переопределения (T). И из-за этого веб-API can not разрешает тип объекта при действии POST, например. mabye в будущем ...
привет Лиам, спасибо за ваш ответ, но это не решит его. У меня была ошибка в коде. теперь DLR работает и вызывает методы, используя DeserializeDynmic of Jil. –