2015-09-02 5 views
4

У меня есть проблема (се) сериализации 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 в будущем ...

ответ

0

Если посмотреть на документ Наиболее распространенные ошибки в вики (https://github.com/kevin-montrose/Jil/wiki/Common-Pitfalls), вы увидите следующее:

Если у вас есть класс FooBase и класс Bar: FooBase и вызов типа JSON.Serialize (myBar), Jil не будет сериализовать члены, унаследованные из FooBase по умолчанию. Обратите внимание, что во многих случаях можно определить общий параметр .

Чтобы исправить это, передайте объект Options с ShouldIncludeInherited значением true.

+0

привет Лиам, спасибо за ваш ответ, но это не решит его. У меня была ошибка в коде. теперь DLR работает и вызывает методы, используя DeserializeDynmic of Jil. –