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

.net 如何确定在给定的命名空间中是否所有对象都可序列化?,.net,serialization,build-process,.net,Serialization,Build Process,一些背景:我们要求所有的DTO对象都是可序列化的,以便它们可以存储在会话中或缓存 正如你所能想象的,这是非常烦人的,而且容易出错。。。使用Visual Studio 2010是否有任何自动化方法(理想情况下作为构建过程的一部分)来确保命名空间中的所有类都标记有[Serializable]属性?您无法在命名空间中找到所有可能的类,但您可以在给定程序集中找到具有指定命名空间的所有类,并进行检查 string dtoNamespace = ...; Assembly assembly = ...; v

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


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

您无法在命名空间中找到所有可能的类,但您可以在给定程序集中找到具有指定命名空间的所有类,并进行检查

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
以任何方式为空:)


编辑:正如评论中提到的,这个属性在这里很方便:)

您可能想考虑的一个工具是,它可以很容易地集成到您的构建中。这允许您运行各种代码度量,然后可以使用这些度量来警告/失败构建

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

WARN IF Count > 0 IN SELECT TYPES FROM NAMESPACES "namespace" WHERE !IsSerializable  
显然,这只会找到解决方案中程序集中包含的类型的名称空间,但我想这就是您的意思


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

Nice(免费)解决方案-但我希望轻松集成到构建过程中。如果我能接受两个答案,我会的@DanP:把它作为单元测试之一有很多缺点吗?那就是我要做的。“只要您定期运行单元测试,它就应该是好的。”Jon-这一点很好。人们希望红色测试足以使构建失败@乔恩-好主意-我想这也是一个选择。@Jon-只是关于这一点的补充说明;我发现将序列化检查更改为.Where(t=>!t.IsSerializable)读起来更好,谢谢这里的建议!非常圆滑…我以前随便看了一下NDepend,但我想我现在已经没有理由不使用它了。