.NET深入学习之---一个不是Bug的Bug
2010-07-23 20:56
405 查看
我的上一篇随笔<.NET Framework源码研究系列之---Delegate>中提到.NET事件的一个Bug.今天整理出来跟大家一起分享一下,顺便请大家说说自己的看法.
不说别的,先看测试代码:
代码
此段代码中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的实例,那么我们如何获取到它呢?如果获取了,又有什么意义呢? 有机会大家一起研究,今天就到此结束了.:)
不说别的,先看测试代码:
代码
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的实例,那么我们如何获取到它呢?如果获取了,又有什么意义呢? 有机会大家一起研究,今天就到此结束了.:)
相关文章推荐
- .NET深入学习笔记(4):深拷贝与浅拷贝
- 从零开始--系统深入学习android(理论-开发前准备-10.一个好的应用应该具备哪些方面-10.1易于访问)保留
- Oracle 学习笔记 图解深入剖析一个事务的操作流程
- 【Spark 深入学习 02】- 我是一个凶残的spark
- 一个PHPer如何深入学习ES搜索引擎?
- 一个PHPer如何深入学习ES搜索引擎?
- .Net中的Interception--一个简单的AOP框架学习
- 从修复 testerhome(rubychina)网站的一个 bug 学习 ruby&rails on ruby
- 学习什么语言的问题,其实,不是一个问题
- EA:这不是一个BUG(只有EA这么财大气粗的才能玩这么NB的招数)
- 基本上,把switch,用设计模式代替,肯定是bug和过度设计。想想,本来修改一个文件几行代码可以解决的问题,变成修改3-6个类才能实现一样的功能。不是傻是什么?
- 实习点滴 - 跟一个蠢bug学习多线程调试、线程安全和可重入函数
- 学习什么语言的问题,其实,不是一个问题......
- ORA-01791: not a SELECTed expression 一个不是 bug 的 bug!
- .NET 2.0 RC的一个Bug
- CURL库FTP传输文件,当ftpServer端默认登录的目录不是根目录/时,有一个bug会产生
- 【转】任何一个学习.net的人都必须知道...
- 学习python 的一个bug
- .net 2.0学习动态语言的另外一个例子?
- 从零开始--系统深入学习android(理论-开发前准备-10.一个好的应用应该具备哪些方面-10.1易于访问)保留