一个类如果没有标记为Serialize,那么调用Serialize()为什么还能编译通过?
如下的小代码:
class Human
{
public int id;
public string name;
[NonSerialized]
public string department;
}
static void Main(string[] args)
{
var lp = new List<Human>()
{
new Human(){id=1,name="abc"},
new Human(){id=2,name="xyz"}
};
IFormatter serializer = new BinaryFormatter();
FileStream fs = File.Open(@"d:\my\my.dat", FileMode.OpenOrCreate);
serializer.Serialize(fs, lp);
fs.Close();
}
我期望的是,既然Human类没有被标记成可以支持Serialize,为什么上面的这段代码还能编译,只是运行时抛出异常:
未经处理的异常: System.Runtime.Serialization.SerializationException: 程序集“Us
Com, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“UseCom.Pr
gram+Human”未标记为可序列化。
为什么不在编译期间就把这个问题挡下来,而是留到了运行时?
C#这样设计的道理是什么?
------解决方案--------------------1:没有标记为Serialize的类是可以序列化的,问题出在你的一个属性标记了NonSerialized,所以需要你标识类为Serialize才可以
2:Attribute是运行时处理的,所以编译的时候.net编译器是处理不到这一块的。Attribute强大之处在于可以通过.net代码逻辑补充很多.net语言之外的特性