(De)使用Jil序列化DynamicObject?

时间:2015-09-02 09:28:47

标签: c# json serialization dynamicobject jil

我有一个问题是(de)序列化 DynamicObject 和其他 Newtownsoft.Json的json库。 (Jil,NetJSON,ServiceStack.Text ......)

这是我的可扩展对象类:

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;
    }
}

其他库(如Jil)的问题是未调用重写的方法。 使用Newtonsoft.Json它的效果很好,但性能很差。

例如 - 反序列化派生类的测试:

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”字段(应该在“Extra”中)

1.有什么解决方案吗?

2.为什么Newtonsoft.Json能够执行操作而JIL不能? (或其他快速库...)。我明白被覆盖的方法应该由 DLR 调用..我怎样才能使它工作?

感谢。

修改

现在我正在使用 DeserilizeDynamic 而不是Deserialize(T)。现在它可以工作,我的方法由DLR调用。 现在唯一的问题是DeserilizeDynamic返回'dynamic'并且没有泛型覆盖(T)。并且因为Web API无法在POST操作上解析对象的类型,例如。 未来的mabye ......

1 个答案:

答案 0 :(得分:0)

如果您查看维基(https://github.com/kevin-montrose/Jil/wiki/Common-Pitfalls)中的Common Trafalls文档,您将看到以下内容:

  

如果你有一个类FooBase和一个类Bar:FooBase和一个类似的调用   JSON.Serialize(myBar),Jil不会序列化继承的成员   来自FooBase默认情况下。请注意,在许多情况下通用   参数可以推断出来。

     

要解决此问题,请将ShouldIncludeInherited设置为的Options对象传递给   真。