JSON.NET - 在运行时排除特定类型的属性

Pio*_*myd 7 .net c# serialization json json.net

我想知道如何排除/剥离给定类型(或其集合)的某些属性使用Json.NET库序列化?我试着编写自己的合约解析器(继承自DefaultContractResolver)而没有运气.

我知道我可以使用DataAnnotations完成,使用ScriptIgnoreAttribute修饰排除的属性,但它不适用于我的场景.序列化的对象几乎可以是任何东西,因此我不知道在设计时要排除哪些属性.我只知道不应该序列化的属性类型.

它看起来像一个相当简单的任务,但遗憾的是我无法在任何地方找到合适的解决方案......

BTW - 我没有绑定Json.NET库 - 如果可以使用默认/其他.NET JSON序列化器轻松完成它对我来说同样是一个很好的解决方案.

UPDATE

在尝试序列化它们之前,必须排除这些属性.为什么?

基本上,我正在接收和序列化的对象类型可以具有继承自IDynamicMetaObjectProvider的类型的动态属性.我不打算描述所有细节,但是从这些对象的GetMetaObject方法返回的DynamicMetaObject没有实现DynamicMetaObject.GetDynamicMemberNames方法(抛出NotImplementedException ...).总结 - 问题是那些对象(我需要排除)不允许枚举它们的属性,Json.NET序列化器试图在幕后做什么.我最终总是抛出NotImplementedException.

Jam*_*mas 5

我已经尝试了WCF JSON序列化以及System.Web.Script.Serialization.JavaScriptSerializer.我发现如果你想要对序列化过程进行可靠的控制,并且不希望受到属性和黑客的约束,那么事情就是可行的JavaScriptSerializer.它包含在.NET堆栈中,允许您创建和注册JavaScriptConverter子类以执行类型的自定义序列化.

我发现可能导致问题的唯一限制是你不能轻易地注册转换器来转换所有子类Object(也就是说,一个转换器来统治它们).您确实需要了解常见的基类,或者通过扫描程序集预先注册这组类型.但是,属性序列化完全取决于您,因此您可以决定使用简单反射哪些属性进行序列化以及如何进行序列化.

另外,对于JSON,默认序列化要比WCF方法好得多.默认情况下,所有类型都是可序列化的,没有属性,枚举按名称序列化,字符串键字典序列化为JSON对象,列表序列化为数组等.但由于显而易见的原因,例如循环树,即使默认行为也需要时间的帮助时间.

就我而言,我支持的是一个与服务器类结构不完全匹配的客户端API,我们想要一个简单易用的JSON语法,并且JavaScriptSerializer每次都能做到.如果您需要一些代码示例来开始,请告诉我.