我想知道如何使用Json排除/剥离给定类型的某些属性(或这些属性的集合)进行序列化。NET库?我试图编写自己的合同解析程序(继承自DefaultContractResolver),但没有成功。
我知道我可以使用DataAnnotations完成,用ScriptIgnoreAttribute装饰排除的属性,但在我的场景中不适用。序列化的对象实际上可以是任何东西,所以我不知道在设计时要排除哪些属性。我只知道不应该序列化的属性的类型。
这看起来是一项相当简单的任务,但不幸的是,我在任何地方都找不到像样的解决方案。。。
BTW-我不受Json的约束。NET库-如果可以使用default/other轻松完成。NET JSON序列化程序,这对我来说也是一个同样好的解决方案。
更新
在尝试序列化属性之前,必须先排除这些属性为什么?
基本上,我正在接收和序列化的对象类型可以具有继承自IDynamicMetaObjectProvider类型的动态属性。我不打算描述所有的细节,但从这些对象的GetMetaObject方法返回的DynamicMetaObject没有动态MetaObject。GetDynamicMemberNames方法实现(throwsNotImplementedException…)。摘要-问题是那些对象(我需要排除)不允许枚举它们的属性,什么Json。NET序列化程序试图在幕后完成。我最终总是抛出NotImplementedException。
我已经尝试了WCF JSON序列化以及系统。网状物剧本序列化。JavaScriptSerializer。我发现,如果您想要对序列化过程进行可靠的控制,并且不想被属性和技巧所束缚,那么JavaScriptSerializer
就是最佳选择。它包含在中。NET堆栈,并允许您创建和注册JavaScriptConverter
子类以执行类型的自定义序列化。
我发现的唯一可能会给你带来问题的限制是,你不能轻易地注册一个转换器来转换Object
的所有子类(也就是说,一个转换器可以统治所有子类)。您确实需要了解公共基类,或者通过扫描程序集预先注册类型集。但是,属性序列化完全由您决定,因此您可以使用简单的反射来决定要序列化哪些属性以及如何序列化。
此外,JSON的默认序列化比WCF方法要好得多。默认情况下,所有类型都可以在没有属性的情况下序列化,枚举按名称序列化,字符串键字典序列化为JSON对象,列表序列化为数组等。但由于明显的原因,例如循环树,即使是默认行为也需要时间的帮助。
在我的案例中,我支持的客户端API与服务器类结构不完全匹配,我们想要一个简单得多的JSON语法,让人一目了然,而JavaScriptSerializer
每次都能做到这一点。如果您需要一些代码示例来开始,请告诉我。
创建您自己的契约冲突解决程序,覆盖为对象创建属性的方法,然后过滤结果以只包括您想要的结果。
您是否考虑过在运行时使用ShouldSerialize前缀属性来排除特定类型的属性?
public class Employee
{
public string Name { get; set; }
public Employee Manager { get; set; }
public bool ShouldSerializeManager()
{
return (Manager != this);
}
}