【问题标题】:How to determine if all objects are serializable in a given namespace?如何确定给定命名空间中的所有对象是否可序列化?
【发布时间】:2010-07-15 15:16:30
【问题描述】:

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

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

【问题讨论】:

    标签: .net serialization build-process


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 非常漂亮...我以前随便看看 NDepend,但我想我现在已经没有借口不使用它了。
    【解决方案2】:

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

    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 属性在这里很方便 :)

    【讨论】:

    • 不错的(免费)解决方案 - 但我希望轻松集成到构建过程中。如果我能接受两个答案,我会的!
    • @DanP:把它作为你的单元测试之一有很多缺点吗?这就是我要做的。只要您定期运行单元测试就可以了。
    • @Jon - 好点。人们希望红色测试足以使构建失败!
    • @Jon - 好主意 - 我想这也是一个选择。
    • @Jon - 只是对此的补充说明;我发现将序列化检查更改为 .Where(t => !t.IsSerializable) 读起来更好看,感谢这里的建议!
    猜你喜欢
    • 2019-11-21
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2010-09-29
    相关资源
    最近更新 更多