对象序列化实验
初中作文教学序列化阶梯式专题化实验初探

探索篇誗课改论坛一、初中作文教学序列化实验初探在我们长期的教学工作中,一直使用的教科书版本为人教版。
教科书的选择对教师开展教学活动有至关重要的影响。
例如,不同版本的教科书会影响教师的讲课内容,同时也会影响教师的授课方法和顺序。
多年来,人教版教材因其合理的内容编排受到教育工作者的青睐。
从整体的语文学习角度看来,人教版教材内容丰富,知识点安排密集合理,加上适度的练习安排,对学生全面地学习语文知识,提高语文综合能力有很大的帮助。
从作文学习角度来看,教师也应适当依据教材的编排合理安排教学进度。
1.单元读写落实探究众所周知,单词和语句是语言的基础。
人教版教材在编写的过程中充分融合了单词和语句的知识要点,并且设置了适当的课后练习。
对于教育工作者来说,进行写作授课要忠于教材的序列化,将每一单元的读写落实,使学生打下坚实的语言基础,熟练运用语言各种表达方式,熟悉各项修辞及表现手法,使学生具备一定的语言基本修养,方可开展更有效的写作教学。
2.基本叙事能力培养探究当学生具备一定的写作能力,教育工作者应适当地给学生增加学习的难度,写作能力的培养最初应具备叙述事实的能力。
在这一阶段教育工作者可以引导学生主动记录生活中的事由或者发表简单的感悟。
在叙事中讲清“起因”“经过”和“结果”。
当学生具备一定的叙事能力和叙事逻辑,学生的写作能力就会有质的提升。
3.丰富表达技法探究在学生对写作有所了解后,即有一定写作记叙文的能力后,教育工作者可适当引导学生使用更高级的表达技法。
例如,“妈妈笑得很开心”此类的初级表达可适当升级为“妈妈的脸上像是开了花一般,满眼笑意”。
这个过程需要教育工作者的悉心提点,耐心纠正。
提升表达技法的过程与培养读写能力一样,是积累性的工作。
二、初中作文教学阶梯式探究作文的学习与其他学科的学习一样,应当循序渐进才能有更好的学习效果。
在进行作文教学中应采用阶梯式的教育方式,在教师的引导下,一步一步具备更高的写作水平。
BurpWeb安全学院[不安全的反序列化]
![BurpWeb安全学院[不安全的反序列化]](https://img.taocdn.com/s3/m/1c27ed1491c69ec3d5bbfd0a79563c1ec5dad7fd.png)
BurpWeb安全学院[不安全的反序列化]介绍burpsuite官⽹上⼀套不安全的反序列化实验(免费)本⽂是在这个实验室学习的记录有针对实验的解决,也有别的⼀些如何识别不安全的反序列化测试不安全的反序列化之前,您肯定要能够识别出序列化对象,下⾯简略介绍两种语⾔的序列化格式以便您能够在遇到它们的时候识别出它们PHP序列化格式PHP的序列化对象是可读的,可以⽤⽂本表⽰的(JAVA的则是⼆进制流,您⽆法⽤⽂本阅读器查看)其中字母代表数据类型,数字代表每项的长度若 User具有以下属性的对象:$user->name = "carlos";$user->isLoggedIn = true;序列化后,该对象可能看起来像这样:O:4:"User":2:{s:4:"name":s:6:"carlos"; s:10:"isLoggedIn":b:1;}解释:O:4:"User"- 具有4个字符的类名称的对象 "User"2 -对象具有2个属性s:4:"name" -第⼀个属性的键是4个字符的字符串 "name"s:6:"carlos" -第⼀个属性的值是6个字符的字符串 "carlos"s:10:"isLoggedIn" -第⼆个属性的键是10个字符的字符串 "isLoggedIn"b:1 -第⼆个属性的值是布尔值 truePHP 序列化的⽅法是serialize()和unserialize()Java序列化格式JAVA(还有⼀些别的语⾔Ruby等) 使⽤⼆进制序列化格式这使⼈难以阅读,但是序列化数据有⼀些固定的特征例如,序列化的Java对象始终以相同的字节开头,它们是 ac edBase64下显⽰为显⽰rO0。
C#程序设计实验指导资料

C#程序设计实验指导课程名称:C#程序设计 _____________ 专业班级:鱼阪科扶學院学生实验报告册(理工学生学号: _________________________ 学生姓名:所属院部:信息技术学院__________ 指导教师:20 12 —— 20 13学年第1学期金陵科技学院教务处制实验报告书写要求实验报告原则上要求学生手写,要求书写工整。
若因课程特点需打印的,标题采用四号黑体,正文采用小四号宋体,单倍行距。
纸张一律采用A4的纸张。
实验报告书写说明实验报告中实验目的和要求、实验仪器和设备、实验内容与过程、实验结果与分析这四项内容为必需项。
教师可根据学科特点和实验具体要求增加项目。
填写注意事项(1)细致观察,及时、准确、如实记录。
(2)准确说明,层次清晰。
(3)尽量采用专用术语来说明事物。
(4)外文、符号、公式要准确,应使用统一规定的名词和符号。
(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。
实验报告批改说明实验报告的批改要及时、认真、仔细,一律用红色笔批改。
实验报告的批改成绩采用五级记分制或百分制,按《金陵科技学院课堂教学实施细则》中作业批阅成绩评定要求执行。
实验报告装订要求实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。
实验项目名称:C#编程基础_______________ 实验学时:6 学时同组学生姓名:无_______________ 实验地点:实验日期:_________________________ 实验成绩:批改教师:_________________________ 批改时间:实验1 C#编程基础一、实验目的(1)熟悉Visual 集成开发环境(IDE),熟悉C#源程序语言的编辑、编译和运行过程;(2)学会创建简单的控制台应用程序和win dows窗体应用程序;(3)能够使用C#选择、循环等流程控制语句编写并调试程序;(4)掌握使用数组来求解一些现实问题的步骤和方法。
《Java程序设计》课程教学大纲

《Java程序设计》课程教学大纲课程编号:08120031课程名称:Java程序设计/JAVA Programming总学时/学分:48/3(其中理论32学时,实验16学时)适用专业:计算机科学与技术一、课程目标通过本课程学习,学生应达到如下目标:目标1. 识别Java语言特点、基本语法、语言机制。
目标2. 将面向对象方法知识运用在程序设计案例中,能使用JAVA常用类、枚举、lambda 表达式、容器、泛型进行实例编程验证。
目标3. 利用JavaSE中的异常处理、输入输出等技术来表达处理程序应用问题。
目标4. 将图形用户界面和数据库编程技术运用中综合应用程序设计中。
目标5. 搭建Java开发环境,能设计实现各种Java技术的应用程序,且能测试运行。
二、课程目标对毕业要求的支撑三、教学过程安排四、实验或上机内容五、课程目标达成方法六、考核标准本门课程考核包括6个部分,分别为考试、作业、实验、讨论和测验。
具体要求及评分方法如下:1、期末考试试卷知识点要求2、作业3、实验4、讨论设置讨论课一次,要求学生按照讨论题目分组查阅资料,归纳总结,撰写报告。
5、测验随堂测验,老师给出题目,学生回答。
具体有任课老师给出评分标准。
七、教材及主要参考资料[1] 黑马程序员. Java基础入门(第2版)[M]. 清华大学出版社, 2018.[2] 郑人杰、马素霞、殷人昆. 软件工程概论(第2版)[M]. 机械工业出版社,2016.[3] Gay S.Horstmann. Java核心技术(第10版)[M]. 机械工业出版社,2016.[4] Y.Daniel Liang(美). Java语言程序设计(第10版)[M]. 机械工业出版社.2015.[5] 李刚. 疯狂Java讲义(第4版)[M]. 电子工业出版社,2018.[6] 封亚飞. 揭秘Java虚拟机[M]. 电子工业出版社,2017.[7] Bruce Eckel(美). Java编程思想(第4版)[M]. 机械工业出版社,2007.。
小学作文序列化训练的实验与研究

浅谈小学作文序列化训练的实验与研究意见。
关键词:小学作文;序列化训练;实验叶圣陶说:“没有一门技术是不需要经过历练的,小学作文的指导训练亦是如此。
”小学作文序列化训练需要科学合理的序列化习作教学相辅助,现阶段的序列化习作教学在实践中应用的并非十分广泛。
我们根据小学作文序列化习作教学方针,设计具有“序列化”针对性的教学内容,深入到习作序列化训练中去,打破以往过分注重学生自我情感抒发,不在技巧和阅读积累训练背景的情况下动笔写作的不恰当的习作教学方法,给语文教师以“小学作文的序列化训练”的重新定位。
一、小学作文序列化训练的概念序列即体系、系统的排列,由简到繁,由易到难,延伸到序列化习作训练即按照思维的逻辑性,设定科学合理的习作教学技术方案,以一体化、系统化为指导方略对学生的习作进行有序的训练,从简易到复杂,循序渐进。
将阅读与写作相牵连,将思维与写作相同步,开拓写作训练的新思维方式,各学习板块穿插、融合,在逻辑缜密的前提下,实现一体化的系统训练,有目标,有策略,统筹交错,帮助学生厚积而薄发,真正地学会写作,喜欢写作,乐于写作。
二、小学作文序列化训练的必要性1.小学作文教学现状现阶段小学语文作文的教学重点放在鼓励学生充分宣泄和表达情感,选择喜欢的主体进行自由的抒发,以我手写我心。
虽然这种教学思路以“因材施教”为教育大纲,一定程度上培养了学生开拓创新和注重自我的精神,但忽略了小学生对于思想和意识的控制力甚为微弱,对写作也没有正确的理解,过分地强调个性只能导致无序、混乱、盲目、随意的写作结果,不仅不利于语文教学活动的开展,甚至还会影响学生的身心健康成长。
故我们必须从小学生时代抓起,训练学生的有序写作技巧,防止误入歧途,为未来的习作发展打好基础2.序列化习作训练特点分析(1)体系化体系化是序列化习作的指导核心,在习作训练中的具体应用表现于围绕作文中心思想,集写作思路、引用材料、写作手法技巧为一体,进行条理清晰,科学系统的整合,各个写作板块交相呼应,缺一不可。
基于JAVA的虚拟实验系统网络传输部分的研究

2 0 经 08
2 主要模块功能实现
21 通 信模块 的 实现 .
本系统主要应用的是 J V A A语言中的 S C E O K T类进行客户端与服务器端之间的连接和通信。在本设计 中, 服务器端首先产生了 Sr r ce对象 , e e okt vS 并预先设定 了两个参数 : 一个端 口地址f 本系统设定为 80 ) 00 ; 另—个是本服务器所要连接的最大客户机数量( 本系统设定为 3 ) 0。 然后再产生一个 Sce对象 , okt 这个 Sce okt 对 象则 是 由 SreSce对 象通 过 acp0 法直接 产 生 的。服务 器每 监 听到一个 客户 端 的请 求 ,都 会产生 evrokt cet方
基于 J V A A的虚 拟 实验 系统 网络传 输 部 分 的研 究
李诚 ,王睿 ,姜永增
( 齐哈 尔大学 计算机与控制工程学院 , 齐 黑龙江 齐齐 哈尔 110 ) 606 摘要 : 成原理虚拟实验 系统 的网络传输部分采用 T P和 U P协议相结合 ,运用 J V 组 C D A A中的各种功能强大 的接 口和实用类 , 实现 了文本信 息在局域 网上的点对点和多点传输 , 并使用了对象序列化的方法 ,提高了系统保证信
—
个新 的 、独立 的 Sce对象 与客 户端 相对应 。最后 ,分别 产 生输入 输 出流 ,以待 在连 接成 功后发送 反馈 okt
信息和接收客户端提供的一些信息。 每个客户端 ,在产生一个 S ce 对象时 ,也都为其设定了两个参数 : okt 一个是服务器 的 I P地址 , 一个
是服务器预先设定的那个端 口号 80 , 00 设置好这些参数后,双方即可实现连接 。另外 ,在客户端还要连接 数据库并完成执行 S L Q 语句的添加 、删除和查询功能 ,并建立数据库的表文件。关于数据库的部分 , 本设
自学考试--复习知识点整理 儿童发展心理学考试资料整理(总)
儿童发展心理学单选题:1.儿童以展心理学的儿童一般是指出生到(17、18岁) 2.遗传决定的代表人物是(高尔顿)3.环境决定论的代表人物是(华生) 4.共同决定论的代表人物是(斯腾) 1.认为支配发展的因素是成熟和学习,并提出成熟决定论的是(格塞尔) 1.格塞尔的理论——成熟势力说,主要来自(双生子研究)1.相互决定论的代表人物是皮亚杰,他假设个体天生有一些基本的(心理格式) 1.德.斐利斯发现只有在植物衍生的某个特定时期,加上某种条件才会产生特定的形态变化,他把这个特定期称为(敏感期) 1.科学儿童心理学的奠基人是(普莱尔) 1.科学儿童心理学正式诞生的标志是(普莱尔出版的《儿童心理》) 1.美国儿童心理研究运动的创始人是(霍尔) 1.霍尔发明的研究儿童心理的新技术是(问卷法) 1.在我国最早讲授儿童心理学的人物是(陈鹤琴)1.陈鹤琴用日记记录自己孩子成长变化的追踪观察成果是(《儿童心理之研究》) 1.在同一时间里,对不同年龄的儿童进行观察,实验成测量探究心理发展规律成特点的研究是(横向研究) 1.在同一个或同一群个体,在较长的时间内进行定期的观察,实验或测量探究心理发展规律的研究是(纵向研究)1.具有时间短、取样大等特点的研究是指(横向研究) 1. 具有时间长、耗资多、选择的被试数量小等特点的研究是指(纵向研究)1.行为主义理论的创始人是(华生) 1.弗洛伊德创立的理论流派是(心理分析理论)1.从水分子上来说,构成染色体的主要物质(脱氧核糖核酸) 1.DNA在生成方式上的特点是(自我复制) 1.遗传物质的载体是(染色体) 1.生命的基本物质是(蛋白质)1.组成蛋白质的单位是(氨基酸) 1.在决定子代的性状表现时,力量较强并且能表现出来的基因叫(显性基因) 1.在决定子代的性状表现时,力量较弱没有表现出来的基因叫(隐性基因) 1.不同的生长周期中儿童的身高和体重增加的速率是不同的,发育的速度经历了两个高峰期,第二高峰期出现在(青春期) 1.男女儿童在身高、体重、肩宽、盆宽等发育曲线上出现了(两次交叉)1.孕的第四周胚胎首先形成的是(神经系统)1.出生时新生儿的脑重是(390克) 1.儿童触摸新生儿脚底,则足趾必向上呈扇形张开,该反应称为(足趾反射) 1.儿童出生约十天出现的第一个条件反射是(哺乳姿势条件反射) 1.不论经济文化教育水平如何,全世界各民族的儿童基本上以同样顺序获得各种动作,说明影响儿童发展的最重要因素是(生理成熟) 1.在儿童发育的第二个阶段迅速发展的系统是(生殖系统) 1.儿童脑内成熟的重要标志是(神经纤维的髓鞘化)1.循环系统是由(中胚层)分化而成的。
一个简单数据管理软件的设计-软件综合设计-学生信息管理系统
8)运行程序,调试程序。
2、源程序代码:
见后:实验结果及分析
3、调试过程记录:
在调试程序的时候,我们必须使程序在某一地点停下来。即是设立断点,其次再运行程序;当程序在设立断点处停下来时,利用各种工具观察程序的状态。程序在断点停下来后,有时我们需要按我们的要求控制程序的运行,以进一步观测程序的流向,从而调试程序。
return;
}
m_XSXX.DeleteString(nIndex);
}
4)void CXSXXGLXTDlg::OnButtonTc()
{//退出
delete this;
CDialog::PostNcDestroy();
}
5)void CXSXXGLXTDlg::OnButtonDr()
{
//导入
6)为对话框成员添加变量:打开ClassWizard窗口,选择Member Variables标签页,Class name下拉列表中选择CScoreDlg类。则对话框中可以创建成员变量的控件ID出现在下方的Control IDs列表中。单击Add Variable按钮,则弹出Add Member Variable对话框,设置变量名即可。
2.对话框对象
当创建一个新的对话框资源后,使用ClassWizard可以创建一个对话框类的派生类。对话框对象实现了对话框和应用程序之间的通信。在应用程序中定义一个对话框对象后,在对话框显示前,可以通过访问对话框对象的成员变量为一个对话框的控件初始化。
3.文档对象
MFC使用文档对象描述应用程序处理的数据,用户输入的数据要进一步的处理,通常要先存贮到文档对象中。比如我们这次的实验:关于学生信息记录处理的应用程序,用户通过一个对话框输入学生信息并贮存到一个文件中。应用程序的处理顺序是:用户在对话框中输入信息,通过对话框对象得到输入信息,将输入信息整理到文档对象中,使用序列化函数将文档对象存贮到一个文件中,所以文档对象扮演了一个很重要的数据交换的角色。
初中作文教学序列化阶梯式专题化实验初探
初中作文教学序列化阶梯式专题化实验初探作者:王尉华来源:《科学导报·学术》2019年第52期摘要:关于初中语文教学,语文教师更多的是在指导众多学子学习语文时积累更多的学习经验。
而作文作为初中语文的“灵魂”所在,是最能体现教师教学成果的关键。
初中时期是学生结束初级教育迈向高中教育的一个重要发展阶段,因此对于初中语文作文能力的要求就显得格外重要。
本文以教育部初中语文部编版新教材为依托,从作文教学的序列化、阶梯式以及专题化三个维度来探讨初中作文训练序列化的必要性和相关策略。
关键词:初中作文;教学序列化;阶梯式;专题化一、基于教材学写作,部编版作文编排体系创设了序列化训练的天然土壤初中语文作文作为语文学科中较为重要的组成部分,由始至终一直是教师们讲课的重点所在,而在教师长期的教学工作中,教科书的选择对教师如何更好地开展教学工作起着至关重要的影响。
往年里,教师讲课使用的教材版本一直为苏教版,但近几年教育部出版了部编版新教材,这就意味着从讲课顺序、课程安排到授课方法等都要遵循教材的转变而发生改变。
在此过程中,教师不得不重新考虑对于初中语文作文的教学方法和观念,从而让学生在写作中牢牢扣住部编版新教材所安排的各级写作特点,这样既让自己适应新教材的上课节奏,也让学生们更轻松的完成学习方法的转变,做到双方共赢,成为了当下语文教师首先要面对及思考的问题。
从教材角度来讲,教师应该顺应新版教材的作文教学节奏,合理安排教学进度,让学生能够更容易领悟教材内容,熟练掌握写作手法。
此外,教师在进行作文序列阶梯式专题教学时,应当认识到专题式教学实际上就是按照学生语文知识的掌握情况,制定具有针对性的作文教学策略,从而让学生能够将自己所学到的知识运用到写作中。
如,教师在教学前应当先对部编版作文编排体系进行了解,构建作文体系的大体教学框架,而后将作文教学框架与初中各个年级的语文知识教学情况进行匹配,使得初中不同年级的学生在进行写作知识学习时具有不同的侧重点。
JAVA作业_Java课程设计实验报告_扫雷_哈工大选修课作业
H a r b i n I n s t i t u t e o f T e c h n o l o g y课程设计报告课程名称: JAVA网络设计设计题目:扫雷游戏院系:电子班级:08设计者:学号:指导教师:辛明影设计时间: 2010,11,29一,题目分析扫雷游戏分析:●扫雷的基本原理九宫格中(3*3共九个格子),中间的数字代表其周围的地雷个数,即以中间数为中心所在地九格中共有中间那个数的地雷。
比如中间为1,那么以这个1为中心,其周围共八个空格中只有一个是地雷。
●扫雷的基本功能1) 开局:首先选择游戏等级,然后生成不同等级的雷区界面。
游戏等级分为三级:各等级方块数为——初级:9×9、中级:16×16、高级:24×24;自定义:X,各级地雷数分别为10,40,99;雷区每个方块下面或埋藏有1个地雷,或者没有地雷;2) 挖雷:鼠标点击方块,可挖开它;若所揭方块下有雷,则踩雷,此时所有含地雷的块都标记,该局游戏失败;如果方块上出现数字,它代表在它周围的8个方块中共有多少颗地雷;3) 标记地雷:在某个光标上点击鼠标右键,则标记此块下埋着地雷(实际上可能是误标),显示为F。
每标记一个地雷,地雷数减少1;4) 自动挖开:如果某个数字方块周围的地雷全都标记完,则自动将其剩下的方块挖开;5) 扩散:扫雷程序还会自动展开已确定没有雷的雷区。
如果a[3,4]周围雷数为1,a[2,3]已被标示为地雷,那么a[24],a[25],a[33],a[35],a[43],a[44],a[45]将被展开,一直波及到不可确定的雷区。
6) 游戏数据的记录:对于得分较高的玩家进行统计,保存在“mine.log”文件中。
7)用于记录游戏时间的独立线程,并在界面实时显示游戏时间。
7)总体设计开发环境:Windows Xp sp3+NetBeans IDE1.项目包的UML视图:图1-项目包视图项目由三个包组成:●saolei.game.mine 功能:这个包是游戏的核心,其中实现了主界面,核心算法,图片管理,等级记录等功能●saolei.awt 功能:实现LedNumber类,把数字格式化为液晶显示图片●saolei.swing 功能:实现 AboutDialog类,响应about事件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学实验报告学生姓名:学号:指导教师:实验地点:实验时间:2011.12.14 一、实验室名称:Linux环境高级编程实验室二、实验项目名称:对象序列化实验三、实验学时:8学时四、实验目的:熟悉基本的对象序列化方法五、实验内容:共进行5个版本的开发:●版本1:将一个类的一个对象序列化到文件●版本2:将一个类的多个对象序列化到文件●版本3:将两个类的多个对象序列化到文件●版本4:按照面向对象的方法,解决多个类的多个对象序列化到文件的问题●版本5:序列化的目的地不仅可以是文件,还可以是其他,即可配置性六、实验步骤:实验一:Test_1.cpp:#include <fcntl.h>#include <vector>#include <iostream>using namespace std; //指定名字空间class test_1{private:int x;public:test_1(){int x = 0;}explicit test_1(int y){x = y;}virtual ~test_1() //虚函数{}public:void file(){cout << "in file(): " << x << endl;}public:bool Serialize(const char *path) const //序列化部分{int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0); //打开experiment文件if(-1 == fd)return false;if(write(fd, &x, sizeof(int)) == -1)//写文件{close(fd);return false;}if(::close(fd) == -1)//关闭文件return false;return true;}bool Deserialize(const char *path) //反序列化部分{int fd = open(path, O_RDWR);//if(-1 == fd)return false;int red = read(fd, &x, sizeof(int));//只序列化一个值if(-1 == red){close(fd);return false;}if(close(fd) == -1)return false;return true;}};int main(){{test_1 ex(1314);ex.Serialize("recored.txt");}test_1 ex;ex.Deserialize("recored.txt");ex.file();}return 0;}运行结果:如图1所示图1:test_1运行结果实验二:Test_2.cpp:#include <fcntl.h>#include <vector>#include <iostream>using namespace std;class test_2{private:int x;public:test_2(){int x = 0;}explicit test_2(int y){x = y;}virtual ~test_2(){}public:void file(){cout << "in file(): " << x << endl;//显示x值public:bool Serialize(const char *Path) const{int fd = open(Path, O_RDWR | O_CREAT | O_TRUNC, 0);//打开文件if(-1 == fd)return false;if(Serialize(fd) == false)//函数重载{close(fd);return false;}if(close(fd) == -1)return false;return true;}bool Deserialize(const char *Path){int fd = open(Path, O_RDWR);if(-1 == fd)return false;if(Deserialize(fd) == false){close(fd);return false;}if(close(fd) == -1)return false;return true;}bool Serialize(int fd) const{if(-1 == fd)return false;if(write(fd, &x, sizeof(int)) == -1)//x值写入文件return false;return true;}bool Deserialize(int fd){if(-1 == fd)return false;int rd = read(fd, &x, sizeof(int));//读出文件中的x值if((0 == rd) || (-1 == rd))return false;return true;}};class SerializerFortest_2{public:SerializerFortest_2(){}virtual ~SerializerFortest_2(){}public:bool Serialize(const char *Path, const vector<test_2>& vec){int fd = open(Path, O_RDWR | O_CREAT | O_APPEND, 0);//打开文件if(-1 == fd)return false;for(int x= 0; x < vec.size(); x++)//写入数组{vec[x].Serialize(fd);}close(fd);return true;}bool Deserialize(const char *Path, vector<test_2>& vec){int fd = open(Path, O_RDWR);if(-1 == fd)return false;for(;;){test_2 ex;if(ex.Deserialize(fd) == true)//读出数组{vec.push_back(ex);}elsebreak;}close(fd);return true;}};int main(){{test_2 ex1(6), ex2(7), ex3(9);//序列化数组vector<test_2> vec;vec.push_back(ex1);vec.push_back(ex2);vec.push_back(ex3);SerializerFortest_2 ser;ser.Serialize("record.txt", vec);}{SerializerFortest_2 ser;//反序列化vector<test_2> vec;ser.Deserialize("record.txt", vec);for(int x = 0; x < 3; x++){vec[x].file();}}return 0;}运行结果如图2所示:图2:test_2运行结果实验三:Test_3.cpp:#include <fcntl.h>#include <vector>#include <iostream>using namespace std;class test_A{private:int x;public:test_A(){int x = 0;}explicit test_A(int y){x = y;}virtual ~test_A(){}public:void file(){cout<<"in file(): "<<x<<endl;}public:bool Serialize(int fd){if(-1 == fd)return false;if(::write(fd, &x, sizeof(int)) == -1)return false;return true;}bool Deserialize(int fd){if(-1 == fd)return false;int rd = read(fd, &x, sizeof(int));if((0 == rd) || (-1 == rd))return false;return true;}};class test_B{private:int x;int y;public:test_B(){x = 0;y = 0;}explicit test_B(int k){x = k;y = k + 1;}virtual ~test_B(){}public:void file(){cout<<"in file(): "<<x<<" "<<y<< endl;}public:bool Serialize(int fd){if(-1 == fd)return false;if(write(fd, &x, sizeof(int)) == -1)return false;if(write(fd, &y, sizeof(int)) == -1)return false;return true;}bool Deserialize(int fd){if(-1 == fd)return false;int rd = read(fd, &x, sizeof(int));if((0 == rd) || (-1 == rd))return false;rd = read(fd, &y, sizeof(int));if((0 == rd) || (-1 == rd))return false;return true;}};struct Serialized{int nType; //0 for test_A; 1 for test_Bvoid *pObj;};class Serializer{public:bool Serialize(const char *Path,std::vector<Serialized> &vec){int fd = open(Path, O_RDWR | O_CREAT | O_TRUNC, 0);if(-1 == fd)return false;for(int x = 0; x < vec.size(); x++){if(write(fd, &(vec[x].nType), 4) == -1){close(fd);return false;}if(0 == vec[x].nType){test_A *p = (test_A *)(vec[x].pObj);if(p->Serialize(fd) == false)return false;}else if(1 == vec[x].nType){test_B *p = (test_B *)(vec[x].pObj);if(p->Serialize(fd) == false)return false;}}if(close(fd) == -1)return false;return true;}bool Deserialize(const char *Path,std::vector<Serialized>& vec) {int fd = open(Path, O_RDWR);if(-1 == fd)return false;for(;;){int nType;int rd = read(fd, &nType, 4);if((-1 == rd) || (0 == rd))break;if(0 == nType){test_A *p;p = new test_A();p->Deserialize(fd);Serialized s;s.nType = nType;s.pObj = p;vec.push_back(s);}else if(1 == nType){test_B *p;p = new test_B();p->Deserialize(fd);Serialized s;s.nType = nType;s.pObj = p;vec.push_back(s);}}if(close(fd) == -1)return false;return true;}};int main(){{test_A ex1(2);Serialized s1;s1.nType = 0;s1.pObj = &ex1;test_B b1(3);Serialized s2;s2.nType = 1;s2.pObj = &b1;test_B b2(4);Serialized s3;s3.nType = 1;s3.pObj = &b2;test_A ex2(5);Serialized s4;s4.nType = 0;s4.pObj = &ex2;std::vector<Serialized> vec;vec.push_back(s1);vec.push_back(s2);vec.push_back(s3);vec.push_back(s4);Serializer s;s.Serialize("data", vec);}{Serializer s;std::vector<Serialized> vec;s.Deserialize("data", vec);for(int x = 0; x < vec.size(); x++){if(vec[x].nType == 0){test_A *p = (test_A *)(vec[x].pObj);p->file();}else if(vec[x].nType == 1){test_B *p = (test_B *)(vec[x].pObj);p->file();}}}return 0;}运行结果如图3所示:图3:test_3运行结果实验四:Test_4.cpp:#include <fcntl.h>#include <iostream>#include <vector>using namespace std;class testSerializable//序列化虚类{public:virtual bool Serialize(int fd) = 0;virtual testSerializable* Deserialize(int fd) = 0;virtual bool GetType(int& type) = 0;public:testSerializable(){}virtual ~testSerializable(){};class test_1 : public testSerializable{private:int i;public:test_1(){i = 0;}explicit test_1(int j){i = j;}virtual ~test_1(){}public:void file(){std::cout << "in file(): " << i << std::endl;}public:virtual bool GetType(int& type){type = 0;return true;}virtual bool Serialize(int fd){if(-1 == fd)return false;if(::write(fd, &i, sizeof(int)) == -1)//序列化return false;return true;virtual testSerializable* Deserialize(int fd)//反序列化{if(-1 == fd)return NULL;test_1 *p = new test_1();int r = ::read(fd, &(p->i), sizeof(int));if((0 == r) || (-1 == r)){delete p;return NULL;}return p;}};class test_2 : public testSerializable{private:int i;int j;public:test_2(){i = 0;j = 0;}explicit test_2(int k){i = k;j = k + 1;}virtual ~test_2(){}public:void file(){std::cout << "in file(): " << i << " " << j << std::endl;}public:virtual bool GetType(int& type){type = 1;return true;}virtual bool Serialize(int fd)//写入多个对象{if(-1 == fd)return false;if(::write(fd, &i, sizeof(int)) == -1)return false;if(::write(fd, &j, sizeof(int)) == -1)return false;return true;}virtual testSerializable* Deserialize(int fd){if(-1 == fd)return NULL;test_2 *p = new test_2();int r = ::read(fd, &(p->i), sizeof(int));if((0 == r) || (-1 == r)){delete p;return NULL;}r = ::read(fd, &(p->j), sizeof(int));if((0 == r) || (-1 == r)){delete p;return NULL;}return p;}};class CLSerializer{private:std::vector<testSerializable*> m_vSerialized;public:bool Serialize(const char *pFilePath, std::vector<testSerializable*>& v) {int fd = ::open(pFilePath, O_RDWR | O_CREAT | O_TRUNC, 0);if(-1 == fd)return false;for(int i = 0; i < v.size(); i++){int type;v[i]->GetType(type);if(::write(fd, &type, 4) == -1){::close(fd);return false;}v[i]->Serialize(fd);}if(::close(fd) == -1)return false;return true;}bool Deserialize(const char *pFilePath, std::vector<testSerializable*>& v) {int fd = ::open(pFilePath, O_RDWR);if(-1 == fd)return false;for(;;){int nType;int r = ::read(fd, &nType, 4);if((-1 == r) || (0 == r))break;int type;for(int i = 0; i < m_vSerialized.size(); i++){m_vSerialized[i]->GetType(type);if(type == nType){testSerializable *p = m_vSerialized[i]->Deserialize(fd);if(p != NULL)v.push_back(p);}}if(::close(fd) == -1)return false;return true;}void Register(testSerializable *pSerialized){m_vSerialized.push_back(pSerialized);}};int main(){{test_1 ex1(2);test_2 e1(3);test_2 e2(4);test_1 ex2(5);std::vector<testSerializable*> v;v.push_back(&ex1);v.push_back(&e1);v.push_back(&e2);v.push_back(&ex2);CLSerializer s;s.Serialize("data", v);}{CLSerializer s;test_1 a;test_2 b;s.Register(&a);s.Register(&b);std::vector<testSerializable*> v;s.Deserialize("data", v);for(int i = 0; i < v.size(); i++)test_1 *p = dynamic_cast<test_1 *>(v[i]);if(p != NULL)p->file();test_2 *q = dynamic_cast<test_2 *>(v[i]);if(q != NULL)q->file();}}return 0;}运行结果如图4所示:图4:test_4运行结果实验五:Test_5.cpp:#include <fcntl.h>#include <iostream>#include <vector>#include <strings.h>#include <stdio.h>class ILSerializable//虚类{public:virtual bool Serialize(int fd) = 0;virtual ILSerializable* Deserialize(int fd) = 0;virtual bool GetType(int& type) = 0;public:ILSerializable(){}virtual ~ILSerializable(){}};class A : public ILSerializable{private:int i;public:A(){i = 0;}explicit A(int j){i = j;}virtual ~A(){}public:void f(){std::cout << "in f(): " << i << std::endl;}public:virtual bool GetType(int& type){type = 0;return true;}virtual bool Serialize(int fd)//文件可配置{if(-1 == fd)return false;if(::write(fd, &i, sizeof(int)) == -1)return false;return true;}virtual ILSerializable* Deserialize(int fd)if(-1 == fd)return NULL;A *p = new A();int r = ::read(fd, &(p->i), sizeof(int));//此处反序列化if((0 == r) || (-1 == r)){delete p;return NULL;}return p;}};class B : public ILSerializable{private:int i;int j;public:B(){i = 0;j = 0;}explicit B(int k){i = k;j = k + 1;}virtual ~B(){}public:void f(){std::cout << "in f(): " << i << " " << j << std::endl;}public:virtual bool GetType(int& type)//定义B类的标示符type = 1;return true;}virtual bool Serialize(int fd){if(-1 == fd)return false;if(::write(fd, &i, sizeof(int)) == -1)return false;if(::write(fd, &j, sizeof(int)) == -1)return false;return true;}virtual ILSerializable* Deserialize(int fd){if(-1 == fd)return NULL;B *p = new B();int r = ::read(fd, &(p->i), sizeof(int));if((0 == r) || (-1 == r)){delete p;return NULL;}r = ::read(fd, &(p->j), sizeof(int));if((0 == r) || (-1 == r)){delete p;return NULL;}return p;}};class CLSerializer{private:std::vector<ILSerializable*> m_vSerialized;public:bool Serialize(const char *pFilePath, std::vector<ILSerializable*>& v)int fd = ::open(pFilePath, O_RDWR | O_CREAT | O_TRUNC, 0);if(-1 == fd)return false;for(int i = 0; i < v.size(); i++){int type;v[i]->GetType(type);if(::write(fd, &type, 4) == -1)//写入类别{::close(fd);return false;}v[i]->Serialize(fd);}if(::close(fd) == -1)return false;return true;}bool Deserialize(const char *pFilePath, std::vector<ILSerializable*>& v) {int fd = ::open(pFilePath, O_RDWR);if(-1 == fd)return false;for(;;){int nType;int r = ::read(fd, &nType, 4);if((-1 == r) || (0 == r))break;int type;for(int i = 0; i < m_vSerialized.size(); i++){m_vSerialized[i]->GetType(type);if(type == nType)//判断类别{ILSerializable *p = m_vSerialized[i]->Deserialize(fd);if(p != NULL)v.push_back(p);}}}if(::close(fd) == -1)return false;return true;}void Register(ILSerializable *pSerialized)//注册{m_vSerialized.push_back(pSerialized);}};char* fcompent(char *pFilePath){//char pFilePath[100];std::cout<<"Input filepath:";scanf("%s",pFilePath);return pFilePath;}/*class FileOperotor{private:public:int nopen( char*,int);int nclose(int);int nwrite(int fp,char* buffer,int size);int nread(int fp,char* buffer,int size);};*/int main(){char pFilePath[100];{if(fcompent(pFilePath) == NULL)//获取用户配置的路径{std::cout<<"has no: %s!\n";return -1;}}{A a1(2);B b1(3);B b2(4);A a2(5);std::vector<ILSerializable*> v;v.push_back(&a1);v.push_back(&b1);v.push_back(&b2);v.push_back(&a2);CLSerializer s;s.Serialize(pFilePath, v);}{CLSerializer s;A a;B b;s.Register(&a);s.Register(&b);std::vector<ILSerializable*> v;s.Deserialize("data", v);for(int i = 0; i < v.size(); i++){A *p = dynamic_cast<A *>(v[i]);if(p != NULL)p->f();B *q = dynamic_cast<B *>(v[i]);if(q != NULL)q->f();}}return 0;}运行结果如图5所示:图5:test_5运行结果七、总结及心得体会:通过本次实验,了解、学习和实践了序列化单个对象,一个类中的多个对象,不同类中的多个对象以及序列化不同的位置等相关内容,以及相关的编程技巧。