您的位置:首页 > 其它

.NET深入学习之---一个不是Bug的Bug

2010-07-23 20:56 405 查看
  我的上一篇随笔<.NET Framework源码研究系列之---Delegate>中提到.NET事件的一个Bug.今天整理出来跟大家一起分享一下,顺便请大家说说自己的看法.

不说别的,先看测试代码:

代码

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;

namespace OneBug{
class Program{
static void Main(string[] args){
try{
Class2 c2 = new Class2();
using (Stream stream = new FileStream("MyFile21.bin", FileMode.Create, FileAccess.Write, FileShare.None))
{
IFormatter formatter = new SoapFormatter();
formatter.Serialize(stream, c2.c1);
stream.Close();
}
Console.Read();
}
catch (Exception ex){
Console.WriteLine(ex.Message);
}
}
}
[Serializable]
public class Class1    {
public int f1 = 1000;
}
[Serializable]
public class Class2    {
public string s1 = "niyw";
public Class1 c1 = new Class1();
}
}


此段代码中c2.c1的序列化结果为

<SOAP-ENV:Body>
<a1:Class1 id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/OneBug/TwoBug%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<f1>1000</f1>
</a1:Class1>

丝毫没有Class2的实体c2的影子.

  至此,显然我们发现了一个问题,那就是为什么tt的序列化文件中会包含us的序列化内容?

难道是微软的Bug吗?!看起来像.不过联系<.NET Framework源码研究系列之---Delegate>中的观点,我们就不难理解这个现象了.TestItem的实例tt中包含了一个事件(Event)OnChange,而这个事件包含了UserClass的实例us的引用.所以在序列化tt的时候连同us一起序列化了.这点也可以从序列化文件中看出端倪,我从中找出了如下内容:

....

<a2:DelegateSerializationHolder id="ref-5" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<Delegate href="#ref-6"/>
<target0 href="#ref-1"/>
<method0 href="#ref-7"/>
</a2:DelegateSerializationHolder>
<a2:DelegateSerializationHolder_x002B_DelegateEntry id="ref-6" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<type id="ref-8">System.EventHandler</type>
<assembly id="ref-9">mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</assembly>
<target id="ref-10" xsi:type="SOAP-ENC:string">target0</target>
<targetTypeAssembly id="ref-11">TwoBug, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</targetTypeAssembly>
<targetTypeName id="ref-12">OneBug.UserClass</targetTypeName>
<methodName id="ref-13">item_OnChange</methodName>
<delegateEntry xsi:null="1"/>

...

  随便写到此处,相比大家明白了文章一开始出现的错误,和对.NET的委托有更深入的了解.

  但是,此处仍有问题让我想不明白.那就是如果我们对tt进行反序列化获得一个TestItem的实例,其中定然有一个UserClass的实例,那么我们如何获取到它呢?如果获取了,又有什么意义呢? 有机会大家一起研究,今天就到此结束了.:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐