如何确定所有对象是否在给定的命名空间中可序列化?

时间:2010-07-15 15:16:31

标签: .net serialization build-process

一些背景知识:我们要求所有DTO对象都是可序列化的,以便它们可以存储在会话中或缓存中。

您可以想象,这非常烦人且容易出错...是否有任何自动化方式(理想情况下作为构建过程的一部分)使用Visual Studio 2010来确保命名空间中的所有类都标有[ Serializable]属性?

2 个答案:

答案 0 :(得分:5)

您可能想要考虑的一个工具是NDepend,它可以轻松集成到您的构建中。这使您可以运行各种代码指标,然后可以使用它们来警告/失败构建。

在CQL(NDepend中的内置查询语言)中,您可以编写如下内容:

WARN IF Count > 0 IN SELECT TYPES FROM NAMESPACES "namespace" WHERE !IsSerializable  

显然,这只会找到解决方案中程序集中包含的类型的命名空间,但我认为这就是你的意思。

NDepend可以作为VS内部构建的一部分自动运行,也可以在单独的构建服务器上运行。它也可以作为独立的应用程序运行。

答案 1 :(得分:4)

您无法在命名空间中找到所有可能的类 - 但是可以查找具有指定命名空间的给定程序集中的所有类,并检查它们。 / p>

string dtoNamespace = ...;
Assembly assembly = ...;
var badClasses = assembly.GetTypes()
                         .Where(t => t.Namespace == dtoNamespace)
                         .Where(t => t.IsPublic) // You might want this
                         .Where(t => !t.IsDefined(typeof(SerializableAttribute),
                                     false);

断言badClasses以任何你想要的方式为空:)

编辑:正如评论中所提到的,IsSerializable属性在这里有点方便:)