代码之家  ›  专栏  ›  技术社区  ›  DanP

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

  •  3
  • DanP  · 技术社区  · 14 年前

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

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   Jon Skeet    14 年前

    在命名空间中找不到所有可能的类-但是 可以 查找所有类 在给定的程序集中 具有指定的命名空间,并检查这些命名空间。

    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 这里的房产很方便。)

        2
  •  5
  •   Rob Levine    14 年前

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

    在cql(ndepend中的内置查询语言)中,您将编写如下内容:

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

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

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