在C#中,我可以在编译类型检查类是否可序列化吗?
我在C#中有一个[Serializable]类,它有许多字段,每个字段都是不同的类。我使用序列化来保存/加载这个类的实例,但我经常忘记在某个地方添加[Serializable]属性,而只是在运行时才知道这一点。在编译过程中可以检查这一点吗 比如这个代码,在C#中,我可以在编译类型检查类是否可序列化吗?,c#,.net,serialization,compile-time,C#,.net,Serialization,Compile Time,我在C#中有一个[Serializable]类,它有许多字段,每个字段都是不同的类。我使用序列化来保存/加载这个类的实例,但我经常忘记在某个地方添加[Serializable]属性,而只是在运行时才知道这一点。在编译过程中可以检查这一点吗 比如这个代码, [Serializable] class House { List<Room> Rooms; } class Room { } [可序列化] 班房{ 列出会议室名单; } 教室 { } 不应通过验证,因为Room类不可序列化。
[Serializable]
class House {
List<Room> Rooms;
}
class Room
{
}
[可序列化]
班房{
列出会议室名单;
}
教室
{
}
不应通过验证,因为Room类不可序列化。不,在编译时无法执行任何操作 然而,为此添加单元测试很容易——您可以在程序集中找到每个可序列化的类,递归地找到所有字段并检查每个字段是否可序列化。当然,更简单的方法是序列化实例:)
单元测试不如编译时检查好,但它比只进行“实时”测试要好。无法确定类型在编译时是否可序列化。对于实现
ISerializable
的类型,可以通过限制API仅采用ISerializable
来实现。但是这对用[Serializable]
修饰的类型不起作用,因为您不能约束API接受应用了特定属性的类型。@MatthewWatson:您不能在编译时使用反射。@MatthewWatson编译时可以检查这一点吗?哎呀,误读了!我已将其删除。:)正如在另一个问题中提到的,您可以使用定制的FxCop规则来完成。