《第5章 面向对象的高级编程.ppt》由会员分享,可在线阅读,更多相关《第5章 面向对象的高级编程.ppt(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 1第第5 5章章 面向对象的高级编程面向对象的高级编程5.1类的的继承与多承与多态性性5.2版本控制版本控制5.3接口接口 5.4委托和事件委托和事件5.5反射反射5.6序列化与反序列化序列化与反序列化2 25.1 5.1 类的继承与多态性类的继承与多态性封装:封装:隐藏藏调用者不需要了解的信息。用者不需要了解的信息。继承:承:简化化类的的设计,为系系统维护提供便利。提供便利。多多态:类为名称相同的方法提供不同名称相同的方法提供不同实现方式的能力。方式的能力。3 35.1.1 5.1.1 基类和扩充类基类和扩充类继承表示承表示现实世界中世界中遗传关系的直接模关系的直接模拟。它表示它表示类之
2、之间的内在的内在联系以及系以及对属性和属性和操作的共享。操作的共享。4 45.1.1 5.1.1 基类和扩充类基类和扩充类OOL中中继承的两种承的两种实现方式方式:实现继承和接口承和接口继承承。被被继承的承的类叫基叫基类/父父类从基从基类继承来的承来的类叫叫扩充充类/派生派生类/子子类实现继承承:表示一个表示一个类型派生于一个基型派生于一个基类型,型,拥有有该基基类型的所有成型的所有成员字段和函数。在字段和函数。在实现继承中,派生承中,派生类型的每型的每个函数采用基个函数采用基类型的型的实现代代码,除非在派生,除非在派生类型的定型的定义中指定重写中指定重写该函数的函数的实现代代码。例如:例如:
3、System.Windows.Forms.TextBox和和System.Windows.Forms.ListBox派派生生于于System.Windows.Forms.Control,并重写了函数,或提供了新的函数,以并重写了函数,或提供了新的函数,以实现特定特定类型的控件。型的控件。接口接口继承承:表表示一个示一个类型只型只继承了函数的承了函数的签名,没有名,没有继承任何承任何实现代代码。C#中,中,实现继承只允承只允许单一一继承承,接口可,接口可实现多重多重继承承。因因为System.Object是一个公共的基是一个公共的基类,所以每个,所以每个C#类(除了除了Object类之外之外)都
4、有一个基都有一个基类,还可以有任意多个基接口可以有任意多个基接口。5 55.1.1 5.1.1 基类和扩充类基类和扩充类声明声明扩充充类的的语法:法:访问修修饰符符class扩充充类名称名称:基:基类名称名称/程序代程序代码扩充充类继承了所有定承了所有定义在基在基类中数据的定中数据的定义和方法。但是和方法。但是扩充充类不不继承基承基类的构造函数的构造函数。注意注意:C#不支持私有不支持私有继承,因此基承,因此基类名上没有名上没有public或或private限定符限定符如果在如果在类定定义中没有指定基中没有指定基类,C#编译器就假定器就假定System.Object是基是基类。6 65.1.1
5、 5.1.1 基类和扩充类基类和扩充类【例例5-1】基基类和和扩充充类的定的定义及用法。及用法。7 75.1.2 5.1.2 多态性多态性多多态性性是指是指对象可以表示多个象可以表示多个类型的能力。型的能力。在在C#中,多中,多态性的定性的定义是:是:同一操作作用于不同的同一操作作用于不同的类的的实例例,不同的,不同的类将将进行不同的解行不同的解释,最后,最后产生不同的生不同的执行行结果果。3种种实现多多态性的方法:性的方法:通通过继承承实现多多态性。性。通通过抽象抽象类实现多多态性。性。通通过接口接口实现多多态性。性。8 85.1.2 5.1.2 多态性多态性1、虚、虚拟方法方法 在基在基类
6、中,如果想中,如果想让某个方法或者事件被某个方法或者事件被扩充充类重写,可重写,可以使用修以使用修饰符符virtual表明:表明:publicvirtualvoidmyMethod()/虚虚拟方法方法/程序代程序代码扩充充类则用用override重写方法重写方法:publicoverridevoidmyMethod()/程序代程序代码9 95.1.2 5.1.2 多态(续)多态(续)使用虚使用虚拟方法和重写方法方法和重写方法时,要注意下面几个方面:,要注意下面几个方面:虚虚拟方法不能声明方法不能声明为静静态的。的。virtual不能和不能和private一起使用。一起使用。重写方法的名称、参数
7、个数、重写方法的名称、参数个数、类型以及返回型以及返回值都必都必须和和虚虚拟方法的一致。方法的一致。10105.1.2 5.1.2 多态(续)多态(续)【例例5-2】重写基重写基类的方法。的方法。11115.1.2 5.1.2 多态(续)多态(续)2、隐藏基藏基类的方法的方法在在扩充充类中,可以使用中,可以使用new关关键字来字来隐藏基藏基类的方法,即使用一的方法,即使用一个完全不同的方法取代旧的方法。个完全不同的方法取代旧的方法。与方法重写不同的是,使用与方法重写不同的是,使用new关关键字字时并不要求基并不要求基类中的方法中的方法声明声明为virtual,只要在,只要在扩充充类的方法前声明
8、的方法前声明为new,就可以,就可以隐藏藏基基类的方法。的方法。classMyDerivedClass:HisBaseClasspublicnewintMyGroovyMethod()/somegroovyimplementationreturn0;【例例5-3】12125.1.2 5.1.2 多态(续)多态(续)3.在在扩充充类直接直接调用基用基类的方法的方法使用使用base关关键字字classCustomerAccountpublicvirtualdecimalCalculatePrice()/implementationreturn0.0M;classGoldAccount:Custom
9、erAccountpublicoverridedecimalCalculatePrice()returnbase.CalculatePrice()*0.9M;13135.1.3 5.1.3 抽象类抽象类使用使用abstract修修饰符。符。抽象抽象类只能做基只能做基类。抽象抽象类与非抽象与非抽象类的区的区别:第一是抽象第一是抽象类不能直接被不能直接被实例化,只能在例化,只能在扩充充类中通中通过继承承使用,使用,对抽象抽象类使用使用new运算符会运算符会产生生编译时错误。第二个不同点是抽象第二个不同点是抽象类可以可以包含抽象成包含抽象成员,而非抽象,而非抽象类不能不能包含抽象成包含抽象成员。当从
10、抽象。当从抽象类派生非抽象派生非抽象类时,这些非抽象些非抽象类必必须具体具体实现所所继承的所有抽象成承的所有抽象成员。1414publicabstractclassoneClasspublicinti;publicvoiddenylau()()i=10;publicabstractvoidmethod();();/可以包含抽象方法可以包含抽象方法,在抽象在抽象类中抽象方法不中抽象方法不提供提供实现。【例例5-4】15155.1.4 5.1.4 密封类密封类密封密封类是指不能被其他是指不能被其他类继承的承的类。在在C#语言中,使用言中,使用sealed关关键字声明密封字声明密封类。C#还提出了密
11、封方法提出了密封方法(sealedmethod)的概的概念念.带有有sealed修修饰符的方法称符的方法称为密封方法密封方法,sealed关关键字也可以限制基字也可以限制基类中中的方法,防止被的方法,防止被扩充充类重写。重写。密封方法同密封方法同样不能被不能被扩充充类中的方法中的方法继承,也不能被承,也不能被隐藏。藏。publicabstractclassEmployeepublicvirtualvoidPay()publicabstractvoidCalculatePay();publicsealedclassHourlyEmployee:Employee/密封密封类publicsealed
12、overridevoidPay()/密封方法密封方法CalculatePay();publicoverridevoidCalculatePay()如果如果试图通通过使用下面的使用下面的语句从密封句从密封类继承:承:classMyDerivedC:HourlyEmployee/Error,将收到将收到错误信息信息:MyDerivedCcannotinheritfromsealedclassHourlyEmployee.16165.1.5 5.1.5 继承过程中构造函数的处理继承过程中构造函数的处理构造函数的构造函数的处理理顺序:序:C#在内部按照下列在内部按照下列顺序序处理构造函数:理构造函数:
13、(1)先父母、后自己:被)先父母、后自己:被继承的父承的父类先构造先构造,继承于父承于父类的的子子类后构造后构造(2)静)静态优先:先:静静态构造函数构造函数,静静态参数都是参数都是优先于非静先于非静态构造函数构造函数,非静非静态参数构造参数构造;【例例5-5】继承机制中构造函数的用法。承机制中构造函数的用法。17175.2 5.2 版本控制版本控制版本控制版本控制(Versioning)主要是主要是为了解决了解决组件的版本不兼容的件的版本不兼容的问题。版本控制版本控制是一个是一个过程,它以兼容的方式程,它以兼容的方式对组件件进行不断的改行不断的改进。版本兼容的方式有:。版本兼容的方式有:源代
14、源代码级兼容:依兼容:依赖于旧版本的代于旧版本的代码在重新在重新编译之后能之后能够与新版本兼容。与新版本兼容。二二进制兼容:依制兼容:依赖于旧版本的于旧版本的应用程序无需重新用程序无需重新编译就能与新版本兼容。就能与新版本兼容。在解决版本在解决版本问题时,c#要求开要求开发人人员清楚地表达他清楚地表达他们的意的意图。方法:方法:用用C#编写方法写方法时,如果在,如果在扩充充类中重写基中重写基类的方法,需要用的方法,需要用override声明声明;要;要隐藏基藏基类的方法,需要用的方法,需要用new声明。声明。调用非虚用非虚拟方法方法时不会受到版本的影响不会受到版本的影响调用虚用虚拟方法的方法的
15、实现部分可能会因部分可能会因扩充充类的重写而影响的重写而影响执行行结果。果。在在 C#中,基中,基类和派生和派生类都可以自由演都可以自由演变,并能,并能够维持二持二进制兼容性制兼容性18185.2 5.2 版本控制版本控制【例例5-6】使用使用virtual、new与与override进行版本控制。行版本控制。19195.3 5.3 接口接口 接口好比一种模版,接口好比一种模版,这种模版定种模版定义了了对象必象必须实现的方法的方法,其目的就是,其目的就是让这些方法可以作些方法可以作为接口接口实例被引用。例被引用。接口中可以定接口中可以定义一个和多个方法、属性、索引指示器和事一个和多个方法、属性
16、、索引指示器和事件。件。接口的主要特点是只有声明部分,没有接口的主要特点是只有声明部分,没有实现部分。部分。接接口是函数成口是函数成员声明的集合声明的集合。接口接口类似抽象似抽象类。接口成接口成员的的实现是通是通过类或或结构构完成的。完成的。如果如果类或或结构从构从一个接口派生,一个接口派生,则这个个类或或结构构负责实现该接口中所声明接口中所声明的所有成的所有成员。一个接口可以从多个接口一个接口可以从多个接口继承,而一个承,而一个类或或结构可以构可以实现多个接口。多个接口。由于由于C#语言不支持多言不支持多继承,因此,如果某个承,因此,如果某个类需要需要继承多承多个个类的行的行为时,只能使用多
17、个接口加以,只能使用多个接口加以说明。明。20205.3 5.3 接口接口 1.接口的声明接口的声明使用使用interface关关键字声明一个接口。常用的字声明一个接口。常用的语法是:法是:访问修修饰符符interface接口名称接口名称/接口体(接口体(方法、属性、索引指示器和事件方法、属性、索引指示器和事件)一一般情况下,以大写的般情况下,以大写的“I”开开头指定接口名,表明指定接口名,表明这是一个接是一个接口口。访问修修饰符符:new、public、protected、internal、private。声明接口声明接口时,需注意以下内容:,需注意以下内容:C#中的接口是独立于中的接口是独
18、立于类来定来定义的的。接接口成口成员只能只能是方法、属性、索引指示器和事件,是方法、属性、索引指示器和事件,不能不能是常量、域、操是常量、域、操作符、构造函数或析构函数,不能包含任何静作符、构造函数或析构函数,不能包含任何静态成成员。接口成接口成员声明不能包含任何修声明不能包含任何修饰符,接口成符,接口成员默默认访问方式是方式是public。类可以可以继承一个基承一个基类,接口根本不能,接口根本不能继承承类。21215.3 5.3 接口接口2.接口的接口的继承承接口允接口允许多多继承,一个派生接口可以没有基接口,也可以有多个基接口。承,一个派生接口可以没有基接口,也可以有多个基接口。继承方法:
19、承方法:在在接口声明的冒号后列出被接口声明的冒号后列出被继承的接口名字,多个接口名之承的接口名字,多个接口名之间用分号分割。例子如下:用分号分割。例子如下:usingSystem;interfaceIControlvoidPaint();interfaceITextBox:IControl/继承了接口承了接口Icontrol的方法的方法Paint()voidSetText(stringtext);interfaceIListBox:IControl/继承了接口承了接口Icontrol的方法的方法Paint()voidSetItems(stringitems);interfaceIComboBo
20、x:ITextBox,IListBox/可以声明新方法可以声明新方法【例例5-7】接口的声明与接口的声明与实现。22225.3 5.3 接口接口3.接口接口实现在在类中中实现接口的接口的函数成函数成员。用。用类来来实现接口接口时,接口,接口的名称必的名称必须包含在包含在类声明中的声明中的:基基类列表列表中。中。如果如果类实现了某个接口,了某个接口,类也也隐式地式地继承了承了该接口的所接口的所有基接口,不管有基接口,不管这些基接口有没有在些基接口有没有在类声明的基声明的基类表中表中列出。列出。因此,如果因此,如果类从一个接口派生,从一个接口派生,则这个个类负责实现该接接口及口及该接口的所有基接口
21、中所声明的所有成接口的所有基接口中所声明的所有成员。实现接口接口的方法:的方法:1、显式式实现接口成接口成员2、继承接口承接口实现2323显式式实现接口成接口成员原因原因:定定义在不同接口中的成在不同接口中的成员可能同名,可能同名,为了避免多了避免多义性性,C#引入引入显式式实现接口成接口成员方法。方法。好好处:显式接口式接口实现允允许程序程序员实现具有相同成具有相同成员名称的两名称的两个接口,并个接口,并为每个接口成每个接口成员各提供一个各提供一个实现。using System;using System;interface ICloneable interface ICloneable ob
22、ject Clone();object Clone();interface IComparable interface IComparable int CompareTo(object other);int CompareTo(object other);class class ListEntry:ICloneable,IComparable ListEntry:ICloneable,IComparable object ICloneable.Clone()object ICloneable.Clone()int IComparable.CompareTo(object int ICompar
23、able.CompareTo(object other)other)ICloneable.Clone 和IComparable.CompareTo 就是显式接口成员执行体2424usingSystem;interfaceIControlvoidPaint();interfaceITextBox:IControlvoidSetText(stringtext);classTextBox:ITextBoxvoidIControl.Paint()/Paint的的显式接口成式接口成员执行体行体voidITextBox.SetText(stringtext)/SetText的的显式接口成式接口成员执行体行
24、体2525注意:注意:对于于显式式实现的接口,不能的接口,不能通通过类的的实例例进行行访问,而必,而必须使用接口使用接口实例。例。interfaceIDemovoidFoo();classMy1:IDemopublicvoidIDemo.Foo()/显式指明式指明Foo是是IDemo中的成中的成员.classMy2:IDemopublicvoidFoo()/没有明确没有明确说明明Foo是是谁的成的成员,隐式式说明明IDemo中的成中的成员.My1 my1=new My1();My1 my1=new My1();my1.Foomy1.Foo();/();/错误,显式实现不允许使用类的引用来调错误
25、,显式实现不允许使用类的引用来调用实现的成员用实现的成员IDemo id1=my1;IDemo id1=my1;id1.Foo();id1.Foo();/正确正确My2 my2=new My2();My2 my2=new My2();my2.Foo();/my2.Foo();/隐式说隐式说明的,正确明的,正确IDemo id2=my2;IDemo id2=my2;id2.Foo();/id2.Foo();/正确正确【例例5-5-8 8】以显式方式实现接口。以显式方式实现接口。26265.4 5.4 委托和事件委托和事件回回调(callback)函数是函数是Windows编程的一个重要部分。程的
26、一个重要部分。回回调函数函数实际上是方法上是方法调用的指用的指针,也称,也称为函数指函数指针,是一个非常,是一个非常强大的大的编程特性。程特性。.NET以委托的形式以委托的形式实现了函数指了函数指针的概念。的概念。当要把方法当要把方法传送送给其他方法其他方法时,需要使用委托。,需要使用委托。1.委托(委托(Delegatedelet)类似与似与C+中的函数指中的函数指针,不同的是,不同的是C+语言的函数指言的函数指针只能只能够指向静指向静态的方法,而委托除了可以指向静的方法,而委托除了可以指向静态的方法之外,的方法之外,还可以指向可以指向对象象实例的方法。例的方法。委托的最大特点是:它不知道或
27、不关心自己引用的委托的最大特点是:它不知道或不关心自己引用的对象的象的类。委托的委托的应用:用:回回调(CallBack)机制、事件)机制、事件处理理。2727委托的声明委托的声明属性集属性集 修修饰符符 delegate函数返回函数返回类型型 定定义的代表的代表标识符符(函数形参列表函数形参列表);修修饰符包括符包括new、public、protected、internal和和private。publicdelegateintMyDelegate();/代代表返回表返回类型型为int,无参数的函,无参数的函数数delegatedoubleTwoLongsOp(longfirst,longse
28、cond);/该委托代表的方法有两个委托代表的方法有两个long型参数,返回型参数,返回类型型为double实际上上,“定定义一个委一个委托托”是指是指“定定义一个新一个新类”。委托委托实现的是的是派派生生自基自基类System.MulticastDelegate的的类,System.MulticastDelegate又派生自基又派生自基类System.Delegate。2828委托举例委托举例委托的使委托的使用用定定义好委托后,就可以好委托后,就可以创建它的一个建它的一个实例例。usingSystem;delegateintMyDelegate();/声明一声明一个委托,个委托,注意声明的位
29、置注意声明的位置publicclassMyClasspublicintInstanceMethod()/非静非静态的方法,注意方法的方法,注意方法为int类型,无参数型,无参数Console.WriteLine(调用了非静用了非静态的方法。的方法。);return0;staticpublicintStaticMethod()/静静态方法,注意方法方法,注意方法为int类型,无参数型,无参数Console.WriteLine(调用了静用了静态的方法。的方法。);return0;2929publicclassTeststaticpublicvoidMain()MyClassp=newMyClass
30、();/下面下面用用new建立建立委托委托MyDelegate的的实例例,d中存中存储的是:的是:非静非静态的方法的方法InstanceMethod的地址的地址MyDelegated=newMyDelegate(p.InstanceMethod);/参数是被参数是被委托委托的方法的方法d();/调用非静用非静态方法方法/下面下面用用new建立建立委托委托类MyDelegate的的对象,象,d中存中存储静静态的方法的方法StaticMethod的地址的地址d=newMyDelegate(MyClass.StaticMethod);/参数是被参数是被委托委托的方法的方法d();/调用静用静态方法方
31、法程序的输出结果是:调用了非静态的方法。调用了静态的方法。【例5-9】委托的用法。30305.4 5.4 委托和事件委托和事件2.事件事件Windows操作系操作系统把用把用户的的动作都看作消息,作都看作消息,C#中称作中称作事件事件,例如用鼠,例如用鼠标左左键单击按按钮,发出鼠出鼠标单击按按钮事件。事件。Windows操作系操作系统负责统一管理所有的事件,把事件一管理所有的事件,把事件发送到各个运行送到各个运行程序。各个程序用事件函数响程序。各个程序用事件函数响应事件,事件,这种方法也叫种方法也叫事件事件驱动。C#语言言使用使用组件件编制制Windows应用程序用程序。组件本件本质上是上是类
32、。在在组件件类中,中,预先定先定义了了该组件能件能够响响应的事件,以及的事件,以及对应的的事件函数,事件函数,该事件事件发生,将自生,将自动调用自己的事件函数。用自己的事件函数。31315.4 5.4 委托和事件委托和事件2.事件事件事件和方法一事件和方法一样具有具有签名,名,签名包括名称和参数列表。名包括名称和参数列表。(1)事件的)事件的签名通名通过委托委托类型来定型来定义,为事件定事件定义委托的常用形式委托的常用形式为:publicdelegatevoidEventHandler(objectsender,EventArgse)/EventHandler可以代表没有返回可以代表没有返回值
33、、参参数数为(objectsender,EventArgse)的函的函数数(2)事件可以使用)事件可以使用event关关键字字进行声明,例如:行声明,例如:publiceventEventHandlerClick;/声明一个事件声明一个事件Click,是代表,是代表类引用引用变量量(3)若要引)若要引发该事件,可以定事件,可以定义引引发该事件事件时要要调用的方法,如下例所示:用的方法,如下例所示:protectedvoidOnClick(EventArgse)/Click事件事件发生,自生,自动触触发OnClick方法方法if(Click!=null)/如果如果Click已已委托委托了了事件事
34、件处理函数,理函数,执行行这个函数个函数Click(this,e);3232如何如何委托委托事件事件处理函数理函数?可以通可以通过“+=”和和“-=”运算符向事件添加委托来运算符向事件添加委托来订阅或取消或取消对应的事件。的事件。publicclassLoginDialog:Form/登登录对话框框类声明声明ButtonOkButton;ButtonCancelButton;publicLoginDialog()/构造函数构造函数OkButton=newButton();/建立按建立按钮对象象OkButton/Click代表代表OkButtonClick方法,注意方法,注意+=的使用的使用Ok
35、Button.Click+=newEventHandler(OkButtonClick);CancelButton=newButton();/建立按建立按钮对象象OkButtonCancelButton.Click+=newEventHandler(CancelButtonClick);voidOkButtonClick(objectsender,EventArgse)/处理理OkButton.Click事件的方事件的方法法voidCancelButtonClick(objectsender,EventArgse)/处理理CancelButton.Click事件的方事件的方法法OkButton
36、.Click+=newEventHandler(OkButtonClick),该语句的意句的意义是使是使OkButton.Click代表事件代表事件处理方法理方法OkButtonClick,这样只要只要Click事件被触事件被触发,事件,事件处理方法理方法OkButtonClick就会被自就会被自动调用。用。3333事件举例事件举例【例例5-105-10】事件的定事件的定义和和调用方法。用方法。34345.5 5.5 反射反射反射的用途是在程序或装配件中反射的用途是在程序或装配件中查找有关找有关类型的信息,或者从型的信息,或者从装配件中装配件中读取元数据。取元数据。反射包含的大多数反射包含的大
37、多数类都在都在System.Reflection命名空命名空间中。中。常用的常用的类:1Type类:查找有关找有关类型的相关信息。型的相关信息。获取指向取指向给定定类型的型的Type对象有象有2种常用方式:种常用方式:(1)使用)使用C#提供的提供的typeof关关键字字获取指定取指定类型的型的Type对象,例象,例如:如:Typet=typeof(double);(2)调用用Type类的的GetType静静态方法。方法。例如:例如:Typet=Type.GetType(System.Double)。2.Assembly类在在System.Reflection命名空命名空间中定中定义,它允,它
38、允许程序程序员访问给定定装配件的元数据。装配件的元数据。Assembly类非常复非常复杂。35355.6 5.6 序列化与反序列化序列化与反序列化u序列化序列化获取取对象并将其状象并将其状态信息信息转换为可存可存储或可或可传输形式的形式的过程。程。u反序列化反序列化将将对象象还原回序列化之前的内容。原回序列化之前的内容。u序列化和反序列化是一个互逆的序列化和反序列化是一个互逆的过程。程。u.NETFramework提供的两种序列化技提供的两种序列化技术二二进制序列化:可以保持制序列化:可以保持类型不型不变,即可以在,即可以在应用程序用程序的不同的不同调用之用之间保留保留对象的状象的状态。XML
39、和和SOAP序列化:序列化:仅序列化公共属性和字段,不保序列化公共属性和字段,不保存存类型。型。36365.6 5.6 序列化与反序列化序列化与反序列化1、如何序列化一个、如何序列化一个类:在:在类的上方加上的上方加上Serializable特性即可。特性即可。SerializablepublicclassMyClass2、二、二进制序列化制序列化MyClassuser=newMyClass();IFormatterformater=newBinaryFormatter();Streamstream=newFileStream(UserInfo.bin,FileMode.Create,File
40、Access.Write,FileShare.None);formater.Serialize(stream,user);stream.Close();特点:特点:二二进制序列化会将一个制序列化会将一个类的所有成的所有成员变量都量都进行序列化,包括私有行序列化,包括私有变量、量、公共属性、方法等。公共属性、方法等。【例例5-11】37375.6 5.6 序列化与反序列化序列化与反序列化3、二、二进制反序列化制反序列化IFormatterformatter=newBinaryFormatter();Streamstream=newFileStream(UserInfo.bin,FileMode.
41、Open,FileAccess.Read,FileShare.Read);MyClassc=(MyClass)formatter.Deserialize(stream);stream.Close();二二进制反序列化的特点:制反序列化的特点:反序列化后,反序列化后,对象象c与序列化之前的状与序列化之前的状态完全相同。完全相同。38385.6 5.6 序列化与反序列化序列化与反序列化4、XML序列化序列化(1)XML序列化序列化仅将将对象的公共字段和属性象的公共字段和属性值序列化序列化为XML流,而不流,而不转换方法、索方法、索引器、私有字段或只引器、私有字段或只读属性(只属性(只读集合除外)。
42、集合除外)。(2)XML序列化不包括序列化不包括类型信息,即不能保型信息,即不能保证序列化后的序列化后的对象在被反序列化象在被反序列化时,变为同一同一类型的型的对象。象。(3)XML序列化的序列化的实现步步骤Class1user=newClass1();user.AccountName=aa;XmlSerializermySerializer=newXmlSerializer(typeof(Class1);StreamWritermyWriter=newStreamWriter(UserInfo.xml);mySerializer.Serialize(myWriter,user);myWrit
43、er.Close();39395.6 5.6 序列化与反序列化序列化与反序列化(4)XML反序列化的步反序列化的步骤Class1c;XmlSerializermySerializer=newXmlSerializer(typeof(Class1);FileStreammyFileStream=newFileStream(UserInfo.xml,FileMode.Open);c=(Class1)mySerializer.Deserialize(myFileStream);myFileStream.Close();注意:注意:反序列化一个反序列化一个对象象时不会不会调用构造函数,用构造函数,这一点与一点与创建建对象不同。象不同。【例例5-12】4040The End