【发布时间】:2010-07-15 15:16:30
【问题描述】:
一些背景知识:我们要求我们所有的 DTO 对象都是可序列化的,以便它们可以存储在会话中或缓存中。
您可以想象,这非常烦人并且容易出错...是否有任何自动化方式(最好作为构建过程的一部分)使用 Visual Studio 2010 来确保命名空间中的所有类都标有 [可序列化]属性?
【问题讨论】:
标签: .net serialization build-process
一些背景知识:我们要求我们所有的 DTO 对象都是可序列化的,以便它们可以存储在会话中或缓存中。
您可以想象,这非常烦人并且容易出错...是否有任何自动化方式(最好作为构建过程的一部分)使用 Visual Studio 2010 来确保命名空间中的所有类都标有 [可序列化]属性?
【问题讨论】:
标签: .net serialization build-process
NDepend 是您可能想要考虑的一个可以轻松集成到您的构建中的工具。这使您可以运行各种代码指标,然后您可以使用这些指标来警告/失败您的构建。
在 CQL(NDepend 中的内置查询语言)中,您可以编写如下内容:
WARN IF Count > 0 IN SELECT TYPES FROM NAMESPACES "namespace" WHERE !IsSerializable
显然,这只会为您的解决方案中的程序集中包含的类型找到命名空间,但我认为这就是您的意思。
NDepend 可以作为 VS 中构建的一部分自动运行,也可以在单独的构建服务器上运行。它也可以作为独立应用程序运行。
【讨论】:
您无法在命名空间中找到所有可能的类 - 但您可以在给定程序集中找到所有具有指定命名空间的类,并检查它们。
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 为空:)
编辑:正如 cmets 中所述,IsSerializable 属性在这里很方便 :)
【讨论】: