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