设计时对一个自己做一个类的实例序列化,再反序列化回来得到一个这个类的实例,(XXXType)用这种方式强转,弹出例外。分析发现,反序列化得到的实例,用GetType()得到的类型名与定义的一样(XXXType),但是这个Type的实例的GetHashCode()得到的Code与原Type的HashCode不同。相同的代码在运行时没有问题。.net库标准类型也没有问题。
GetHashCode()是不是标示托管堆里唯一一个实例?
这个问题是不是.net的BUG?
补充说明:上面的现象发生条件,
1.设计时
2.打开工程之后,从文件菜单的关闭解决方案关闭工程,再在原.net窗口打开这个工程,
  这是上面的现象就会发生。有愿意研究的人可以一起讨论一下,或者有解决办法的人请帮个忙

解决方案 »

  1.   

    楼主可以作一个以下的实验:
    int i=1;
    long l=10;
    int j=(int)l;
    MessageBox.Show(i.GetHashCode().ToString()+Environment.NewLine+l.GetHashCode().ToString()+Environment.NewLine+j.GetHashCode().ToString());上面的代码执行后,输出的结果是:
    1
    10
    10就是说第三个变量j虽然是由long类型被强制转化int类型,但是j调用GetHashCode()方法后返回得值还是和强制转换前的变量l的GetHashCode()方法返回的值相同。我想这应该能够说明你反序列化并且强制转化后得到的对象调用GetHashCode()后得到的值和原对象调用GetHashCode()方法得到的值不一样了。
      

  2.   

    HashCode应该是标识托管堆中唯一一个实例(估计),你给出的例子,1和10属于常数,不管它赋予
    int还是long,本身的HashCode是不会变的。
    我说的并不是在某个对象上调用GetHashCode(),而是先GetType()取得这个对象的类型,然后类型的实例上GetHashCode(),理论上,同一个执行环境下的同一个Type的若干个实例,用GetType()取得的Type的实例都应该是同一个对象,即
    aaa is ClassABC && bbb is ClassABC
    aaa.GetType().GetHashCode() == bbb.GetType().GetHashCode()
    这个在运行时环境下面可以证实。
    但是在设计时,以上就不成立。验证方法见一楼的补充说明。