日期:2014-05-16  浏览次数:21017 次

一个类如果没有标记为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语言之外的特性