文档库 最新最全的文档下载
当前位置:文档库 › 闪客教育 浅谈XML与对象的序列化与反序列化

闪客教育 浅谈XML与对象的序列化与反序列化

闪客教育 浅谈XML与对象的序列化与反序列化
闪客教育 浅谈XML与对象的序列化与反序列化

浅谈XML与对象的序列化与反序列化

这篇文章主要讲述XML与对象的序列化与反序列化。并且会附上一些简单的序列化与反序列化方法,供大家使用。

假设我们在一个Web项目中有这样两个类

1public class Member

2{

3 public string Num { get; set; }

4 public string Name { get; set; }

5}

6public class Team

7{

8 public string Name;

9 public List Members { get; set; }

假设我们需要把Team类的一个实例POST到一个URL,

当然,使用Form隐藏域提交就可以完成该功能。

如果该Team涵概三十条数据呢?

为了辨别每一个Member,我们得给参数的名字加上后缀。这就要一大串的隐藏域来完成:

1@model Team

2

method="post">

3 4

value="@Model.Members[0].Num" />

5

value="@Model.Members[0].Name" />

6...

7

value="@Model.Members[29].Num" />

8

value="@Model.Members[29].Name" />

9

10

还敢想象一下如果Team再复杂一些,嵌套再多一些的状况么?

呃,即使你愿意这么传数据,对方看到一坨参数名就够头疼了。

我们都知道对象是不能在网络中直接传输的,不外尚有补救的方式。

XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储数据,任何一个对象都可以用XML来描述。以Team类为例:

13

14

xmlns:xsd="https://www.wendangku.net/doc/1617663302.html,/2001/XMLSchema">

15 Development

16

17

18 001

19 Marry

20

21

22 002

23 John

24

25

26

这样一个XML文档就显露了Team一个实例。

聪明的看官应该已经想到,XML是可以作为对象信息的载体在网络中传输,因为它是文本形式的。

怎么进行XML文档与对象的相互转换呢?

XmlSerializer类就是干这个活的。

命名空间:System.Xml.Serialization

程序集:System.Xml(在 system.xml.dll 中)

现在这里展示了一个提供序列化与反序列化方法的EncodeHelper类。

Deserialize方法将XML字符串转换为指定类型的对象;

Serialize方法则将对象转换为XML字符串。

27///

28 /// 提供xml文档序列化反序列化

29 ///

30 public sealed class EncodeHelper

31 {

32 ///

33 /// 反序列化XML字符串为指定类型

34 ///

35 public static object Deserialize(string Xml, Type ThisType)

36 {

37 XmlSerializer xmlSerializer = new XmlSerializer(ThisType);

38 object result;

39 try

40 {

41 using (StringReader stringReader = new StringReader(Xml))

42 {

43 result = xmlSerializer.Deserialize(stringReader);

44 }

45 }

46 catch (Exception innerException)

47 {

48 bool flag = false;

49 if (Xml != null)

50 {

51 if

(Xml.StartsWith(Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble( ))))

52 {

53 flag = true;

54 }

55 }

56 throw new ApplicationException(string.Format("Couldn't parse XML: '{0}'; Contains BOM: {1}; Type: {2}.", Xml, flag, ThisType.FullName), innerException);

57 }

58 return result;

59 }

60

61 ///

62 /// 序列化object对象为XML字符串

63 ///

64 public static string Serialize(object ObjectToSerialize)

65 {

66 string result = null ;

67 try

68 {

69 XmlSerializer xmlSerializer = new

XmlSerializer(ObjectToSerialize.GetType());

70

71 using (MemoryStream memoryStream = new MemoryStream())

72 {

73 XmlTextWriter xmlTextWriter = new

XmlTextWriter(memoryStream, new UTF8Encoding(false));

74 xmlTextWriter.Formatting = Formatting.Indented;

75 xmlSerializer.Serialize(xmlTextWriter,

ObjectToSerialize);

76 xmlTextWriter.Flush();

77 xmlTextWriter.Close();

78 UTF8Encoding uTF8Encoding = new UTF8Encoding(false,

true);

79 result=

uTF8Encoding.GetString(memoryStream.ToArray());

80 }

81 }

82 catch (Exception innerException)

83 {

84 throw new ApplicationException("Couldn't Serialize

Object:" + ObjectToSerialize.GetType().Name, innerException);

85 }

86 return result;

87 }

88 }

要使用这个类需要添加以下引用

89using System;

90using System.Text;

91using System.IO;

92using System.Xml;

93using System.Xml.Serialization;

下面我们用一个控制台程序来演示一下这个类是如何工作的。这里是程序的Main函数。

94static void Main(string[] args)

95 {

96 List Members = new List();

97 Member member1 = new Member { Name = "Marry", Num =

"001" };

98 Member member2 = new Member { Name = "John", Num =

"002" };

99 Members.Add(member1);

100 Members.Add(member2);

101 Team team = new Team { Name = "Development", MembersMembers = Members };

102 var xml =EncodeHelper.Serialize(team);//序列化

103 Console.Write(xml);//打印序列化后的XML字符串

104 Console.ReadLine();

105 Team newTeam = EncodeHelper.Deserialize(xml, typeof(Team)) as Team;//反序列化时需要显式的进行类型转换

106 Console.WriteLine("Team Name:"+https://www.wendangku.net/doc/1617663302.html,);//显示反序列化后的newTeam对象

107 foreach (var member in newTeam.Members)

108 {

109 Console.WriteLine("Member Num:" + member.Num);

110 Console.WriteLine("Member Name:" + https://www.wendangku.net/doc/1617663302.html,);

111 }

112 Console.ReadLine();

113 }

在执行完Console.Write(xml)这行代码后,就可以看到打印出来的XML文档了。

114

115

xmlns:xsd="https://www.wendangku.net/doc/1617663302.html,/2001/XMLSchema">

116 Development

117

118

119 001

120 Marry

121

122

123 002

124 John

125

126

127

与我在文章开头给出的例子是一模一样的。

最终反序列化出来的newTeam对象打印出来是这样的结果。

Team Name:Development

Member Num:001

Member Name:Marry

Member Num:002

Member Name:John

回到我们开头的Web通信的例子,

利用XML序列化与反序列化来进行对象传送,咱们只要求把需求传送的对象序列

化为XML字符串,使用一个隐藏域进行form提交就可以搞定咯!

接收方再将接收到的XML字符串反序列化成预设的对象即可。前提是双方必须约

定序列化与反序列化的过程一致,且对象相同。

最后我们来看一下怎么利用一些特性来控制序列化与反序列化操作的过程。我们

把开端的类改一下:

128public class Member

129 {

130 [XmlElement("Member_Num")]

131 public string Num { get; set; }

132 public string Name { get; set; }

133 }

134 [XmlRoot("Our_Team")]

135 public class Team

136 {

137 [NonSerialized]public string Name;修正于2012-4-13 138[XmlIgnore]public string Name;

139 public List Members { get; set; }

140 }

141

142

143public class Member

144 {

145 [XmlElement("Member_Num")]

146 public string Num { get; set; }

147 public string Name { get; set; }

148 }

149 [XmlRoot("Our_Team")]

150 public class Team

151 {

152 [NonSerialized]public string Name;修正于2014-7-13 153[XmlIgnore]public string Name;

154 public List Members { get; set; }

155 }

然后我们再次执行刚才的控制台程序,序列化结果变成了这样:

156

157

xmlns:xsd="https://www.wendangku.net/doc/1617663302.html,/2003/XMLSchema">

158 Development修正于2014-7-13

159

160

161 001

162 Marry

163

164

165 002

166 John

167

168

169

本来的根节点Team变成了Our_Team,Member的子节点Num变成了Member_Num,

并且Team的Name子节点被忽略了。

可见特性XmlRoot可以控制根节点的显示和操作过程,XmlElement则针对子节

点。如果某些成员被标记XmlIgnore NonSerialized修正于2012-4-13特性,

则在序列化与反序列化过程中会被忽略

WebLogic 组件反序列化漏洞补丁升级操作手册

weblogic反序列化补丁安装 梁裕 1、到weblogic官网下载补丁包(p2*******_1036_Generic.zip、 p2*******_1036012_Generic.zip如果找不到的朋友,可以在回复中给我留下邮箱,我会定期回复。) 2、10.3.6对应的补丁包p2*******_1036012_Generic.zip ,补丁包需要依赖于一个大的升级 包,所以需要把p2*******_1036_Generic.zip也下载下来。 3、登录linux的weblogic用户,切换到/home/weblogic/Oracle/Middleware/utils/bsu/目录下。 4、确认当前weblogic版本,并确认所有域的进程全部关闭 ./bsu.sh -prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3/ -status=applied -verbose –view 5、查看是否存在/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir 目录,没有的需要 手工创建。 6、将补丁包上传到/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir目录下 7、首先打大的升级包,解压p2*******_1036_Generic.zip unzip p2*******_1036_Generic.zip EJUW对应就是后面命令的patchlist 8、执行补丁安装命令。 ./bsu.sh -install -patch_download_dir=/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir -patchlist=EJUW-prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3 –verbose 9、打序列化的补丁包,解压p2*******_1036012_Generic.zip unzip p2*******_1036012_Generic.zip ./bsu.sh -install -patch_download_dir=/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir -patchlist=ZLNA-prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3 –verbose 10、在打ZLNA补丁包时,遇到了内存溢出的问题。需要修改bsu.sh脚本,将内存调大。 11、启动weblogic的域,查看输出日志。确定版本是否生效。

java序列化的作用

最近在阅读Core J2EE Patterns 的时候发现例子里用于在各个层次里进行传输的TO(Data Transfer Object)都实现了java.io.Serializable接口,看到这些偶突然感到茅塞顿开~困扰了很久的关于Serializable的疑问渐渐解开了,查找相关资料并总结如下: 序列化是什么: 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。 序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例 序列化的什么特点: 如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。 什么时候使用序列化: 一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。 二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。 ====================== 可以看看接口java.io.serializable的中文解释: Serializable public interface Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

对象序列化实验

电子科技大学 实验报告 学生姓名:学号:指导教师: 实验地点:实验时间:2011.12.14 一、实验室名称: Linux环境高级编程实验室 二、实验项目名称: 对象序列化实验 三、实验学时: 8学时 四、实验目的: 熟悉基本的对象序列化方法 五、实验内容: 共进行5个版本的开发: ●版本1:将一个类的一个对象序列化到文件 ●版本2:将一个类的多个对象序列化到文件 ●版本3:将两个类的多个对象序列化到文件

●版本4:按照面向对象的方法,解决多个类的多个对象序列 化到文件的问题 ●版本5:序列化的目的地不仅可以是文件,还可以是其他, 即可配置性 六、实验步骤: 实验一: Test_1.cpp: #include #include #include 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"); }

C++序列化反序列化库Kapok

C++序列化/反序列化库Kapok 1.Kapok的特点 简单,易用,header-only,只需要引用Kapok.hpp即可;高效,初步测试性和messagepack 相当。 它是纯c++11实现,因此需要支持C++11的编译器。 2.主要功能 对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个tuple的例子吧。 //序列化 Serializer sr; auto tp = std::make_tuple(10, 12, string("test")); sr.Serialize(tp, "tuple"); //反序列化 DeSerializer dr; std::tuple p; dr.Parse(sr.GetString()); dr.Deserialize(p, "tuple"); 看起来是不是很简单! 再看一个序列化一个自定义对象的例子。 struct Person { int age; string name; string city; META(age, name, city) }; Person p = { 18, "bb", "aa" }; //序列化 Serializer sr; sr.Serialize(p, "Person"); //反序列化 DeSerializer dr;

Person person; dr.Parse(sr.GetString()); dr.Deserialize(person, "Person"); 一样的很简单,结构这里需要一个宏定义META,这个META的作用就是获取对象的元信息,有了这个元信息我们就可以很方便的实现序列化和反序列化了。 3.应用场景 Kapok除了不支持指针之外所有的对象都支持,支持结构体的无限嵌套(被嵌套的结构体也必须定义META宏)。这里说一下为什么不支持指针呢,因为对象中有指针的话存在两个问题:1.这个指针如果是动态数组的话,c++中无法获取这个数组的长度;2.指针还涉及到内存管理,我希望Kapok专注于序列化和/反序列化,暂时不考虑内存管理。 4.结构体必须有一个宏定义是否具有侵入性? 看起来每个序列化/反序列化的对象都要带一个宏定义似乎侵入性较强,但这种侵入性是完全无害的,因为它只是定义了一个额外的函数而已,这个函数只会在序列化/反序列化的时候才会用到,不会对当前对象造成任何影响,还有一点是因为c++没有反射,必须要通过某种方法来获取对象的元信息,纵观目前所有的序列化方案,只有这种方式是最简洁的,用户做最少的事情即可,这也是我选择这种方式的原因。 5.Kapok是如何实现序列化/反序列化的 Kapok的最底层是用到了rapidjson, 用它来实现对基本类型的序列化,对它做了一个简单的封装以便供上层使用,上面层就是序列化\反序列化实现层,主要是实现对对象元信息的解析和自动化的打包和解包。下面是Kapok序列化的一个示意图: 6.Kapok的性能如何 初步测试对一个tuple进行序列化/反序列化一万次,发现Kapok的耗时和messagepack相当。 7.Kapok是否支持多语言 暂时不支持,先把c++版本做好再说,如果要支持多语言的话,需要用其它语言进行重写,

C#编程实验

实验一 1. 尝试用命令行方式编译一个简单的控制台程序为可执行PE文件。 (1) 先用“记事本”编写一个简单的控制台应用程序p1.cs,该程序中只包含可供测试的几行简单代码,例如为: using System; using System.Threading; class test { static void Main() { int x, y; x=Int32.Parse(Console.ReadLine()); y=Int32.Parse(Console.ReadLine()); Console.WriteLine("{0}+{1}={2}",x, y, x+y); Console.ReadLine(); } } (2) 使用C:\Windows\https://www.wendangku.net/doc/1617663302.html,\Framework\v2.0.50727\csc.exe 程序(该路径为VS2005下适用,如果用更高版本时应相应调整)以及适当的参数执行编译命令。产生一个可执行PE程序。 (3) 执行该PE程序,观察是否符合预期。 (4) 观察用以上方法编译时,如果代码中有错误,系统如何输出错误信息? 2. 使用GC类控制.NET的垃圾回收操作。 (1) 按照教材上【例1-3】,建立C#的控制台应用程序。 (2) 编译调试该程序,观察、记录控制台输出。 (3) 如果要使MakeSomeGarbage方法中产生的对象不会被回收,应该如何修改MakeSomeGarbage中的代码?修改后实际运行时,观察程序输出的相关信息是否与预计一致(需要与修改前输出的内存占有数据相比较)。 3. 学习使用委托 (1) 按照教材上【例1-5】,建立C#的控制台应用程序。 (2) 编译调试该程序,观察、记录控制台输出。 4. 不要利用Visual https://www.wendangku.net/doc/1617663302.html, IDE环境的“工具箱”、“属性窗口”,最好只使用“笔记本”写代码,编写一个“Hello,World!”的Windows应用程序。 (1) 该Windows程序窗体上有一个按钮。当单击按钮时,弹出对话框显示“Hello,World!”。 (2) 在“命令行窗口”下执行CSC将C#代码文件编译为PE程序。 提示: 可在Form_Load等事件中执行Button button1=new Button(); 创建该按钮,对该按钮,要将其加入到Form的Controls集合中。然后对按钮的Text、Position等属性赋值。最后记得要为单击按钮的事件设置一个方法:

最新初中课题研究《主题式序列化作文教学课题实验》阶段工作总结

初中课题研究《主题式序列化作文教学课题实验》阶段工作总 结

初中课题研究《主题式序列化作文教学课题实验》阶段总结 我校自自己申报的原创课题——“主题式作文序列化教学课题实验”在山东省教科所立项以来,课题实验组老师热情饱满,态度积极,自觉加强理论学习,勇于作文教学改革实践,阶段性工作取得了一定的成效,现将本学期工作总结如下: 一、积极创设条件,进行课题申报 我校的作文教学有一定的教改基础,我校积极参与实施了淄博市体验式作文教学改革的实验,为我市作文教学改革的实验单位之一,作文教学改革取得了一定的成效,不少教师积累了一些经验,对作文教学方法的研究有了一些新的认识。如我校牟维和老师出版了作文教学专著《中学生使用话题作文指导》(延边大学出版社)牛晓彬老师获得淄博市作文竞赛辅导一等奖。牟维和老师获得淄博市体验式作文教学教学案例一等奖,我校在桓台县作文竞赛中获得全县第一名等,但不可否认的是作文教学的现状堪忧,应试作文愈演愈烈,公式化模式化、所谓的考场作文教学严重束缚了学生的个性化发展,说假话,写假事;小孩儿说大人话,毫无童心童趣;"内容空洞,不实在,不具体;一段一段甚至整篇整篇地抄写别人的作文;千人一面,没有个性和特点,究其原因,主要在:作文与学生生活、学习严重脱离,学生无内容可写,形成了"巧妇难为无米之炊"的尴尬局面;作文教学存在着"文学化"、"成人化"的倾向,使学生感到高不可攀,逐渐失去对作文的兴趣;作文教学存在着随意性及无目的、大操练的倾向,缺乏一定的训练序列。由此可见,作文教

学少了对学生主体精神的关注,写作没有成为孩子生活的真实需要。因此,我们认为应该让作文回归其本体功能――让学生在真实的生活中写作。我校的语文教师带着困惑与思考走到了一起,在淄博市教研室崔雪梅老师的直接指导下,“主题式作文序列化教学”实验课题应运而生。课题实验组人员热情高涨,积极准备。或阅读钻研理论著作,或进行调查研究,或向专家请教,或进行实验设计。2008年3月27日又召开了课题实验论证会,会上邀请了山东省初中语文教研员张伟忠老师,省教科所张斌博士作实验指导报告,与会专家提出许多指导性意见,为课题的顺利开展打下了坚实的基础。最后在学校领导的支持下,在市教研室的帮助下,“主题式作文序列化教学”课题实验的申报得以成功。 二、加强教学调查,确定实验班级与研究计划 课题的实验是建立在对教与学的基础上,其研究的根本目的是促进学生写作水平的提高,因此课题实验开始时重新对全校学生的作文现状作了全面深入的分析研究,并此基础上,确定了课题实验的年级——2006级,并召开了课题组会议,依据调查情况确定了课题研究开展的计划与方法。 三、加强课题研究中的理论学习 本课题试图通过研究,让教师在观念上确定以提高学生“观察生活,积累生活,感悟生活,表达生活”的能力为目标,“以课堂为轴心,向学生生活的各个领域开拓延展,充分利用一切可以利用的渠道和机会,发展学生作文能力”的“生活作文”教育观。教师必须更新自己

JAVA序列化基础知识Serializable与Externalizable的区别

大家都知道Serializable是一个mark interface,告诉JVM这个对象可以被转换成二进制流来传输. 但是Serializable与Externalizable的转换二进制流的过程是不一样的. Serializable 在我们实现这个接口的时候,我们可以使用4个私有方法来控制序列化的过程: 我们来看一个例子: public class FooImpl implements java.io.Serializable{ private String message; public String getFoo() { return message; } public void setMessage(String message) { this.message = message; } private void writeObject(java.io.ObjectOutputStream out) throws IOException { System.out.println("writeObject invoked"); out.writeObject(this.message == null ? "hohohahaha" : this.message); } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { System.out.println("readObject invoked"); this.message = (String) in.readObject(); System.out.println("got message:" + message); } private Object writeReplace() throws ObjectStreamException { System.out.println("writeReplace invoked"); return this; } private Object readResolve() throws ObjectStreamException { System.out.println("readResolve invoked"); return this; }

Apache Shiro反序列化远程代码执行-其他利用姿势

12下一页 返回列表 回复发帖 帖子2 积分1 TCV0 TuBi1 坛龄84天 1# 跳转到? 倒序看帖 打印字体大小: T00LS ? 渗透测试文章(Security Articles) ? 投稿文章:通过Shiro反序列化拿下某空管局服务器root权限 steven 新手上路 发表于 所需阅读权限 20 [【原创】]投稿文章:通过Shiro反序列化拿下某空管局服务器root 权限 xuehei|提醒短消息论坛任务|个人中心退出 首页版块搜索银行T00ls工具帮助

目标站返回rememberMe的cookie字段或者在请求包中含有rememberMe的cookie字段的时候,说明该目标站是用了shiro框架漏洞利用 ①猜解密钥 前文中提到的硬编码的密钥,在实际生产环境中不同的项目可能会存在不同的密钥(key),从github上搜集了部分常用的key用于猜解,这里用到dnslog来判断是否成功. 可以看到当Key为kPH+bIxk5D2deZiIxcaaaA==时,服务器收到了目标站的请求,这里我们可以确定该站的key为 kPH+bIxk5D2deZiIxcaaaA== ②命令执行 这里我们利用ysoserial工具进行漏洞利用. 在服务器上执行 java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 2020 CommonsCollections1 'ping -c 1 sl0437.ceye.io' 可以看到已经接收到了目标站的请求,并且payload发送给目标站以后成功执行了ping命令.说明目标站CommonsCollections1存在反序列化漏洞 ③反弹shell 在实战中发现,虽然可以成功执行命令了,但是由于runtime等环境因素并不能直接反弹shell,这个可以采用先下载后运行的方式.

对象序列化实验

电子科技大学 实验报告 学生:学号:指导教师: 实验地点:实验时间:2011.12.14 一、实验室名称: Linux环境高级编程实验室 二、实验项目名称: 对象序列化实验 三、实验学时: 8学时 四、实验目的: 熟悉基本的对象序列化方法 五、实验容: 共进行5个版本的开发: ●版本1:将一个类的一个对象序列化到文件 ●版本2:将一个类的多个对象序列化到文件 ●版本3:将两个类的多个对象序列化到文件

●版本4:按照面向对象的方法,解决多个类的多个对象序列 化到文件的问题 ●版本5:序列化的目的地不仅可以是文件,还可以是其他, 即可配置性 六、实验步骤: 实验一: Test_1.cpp: #include #include #include 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"); }

java实验九

《Java 语言程序设计》实验报告(九) 实验名称:______________指导教师:______ _____实验日期:_________ 专 业:______________班 级:___________姓 名:_________ Java 数据流编程 张鑫 2015-12-25 电子商务 电子商务1302 李鸿儒

三、实验结果与结论:(经调试正确的源程序(核心部分)和程序的运行结果)LX5_3.java程序执行结果如图1所示: 图1 LX5_4.java程序执行结果如图2所示: 图2 LX5_5.java程序执行结果如图3所示: 图3 LX5_6.java程序执行结果如图4所示: 图4 LX10_3.java程序执行结果如图5所示: 图5 1、请设计一个从键盘输入一个数n,求n! Jiecheng.java源程序如下: import java.util.Scanner; public class Jiecheng{ public static void main(String args[]){ Scanner input=new Scanner(System.in); System.out.println("请输入数字n:"); int n=input.nextInt(); System.out.println("n!="+sum(n)); }

public static int sum(int n){ int sum=1; for(inti=1;i<=n;i++) sum*=i; return sum; } } Jiecheng.java程序执行结果如图6所示: 图6 2、写一个程序,允许用户依次输入多个姓名和住址,并能将用户的输入保存到文件中。用户输入“quit”表示输入完毕,程序退出。 Test1.java源程序如下: import java.util.Scanner; import java.io.*; public class Test1{ public static void main(String args[]){ OutputStreamos=null; OutputStreamWriterosw=null; BufferedWriterbw=null; try{ os=new FileOutputStream("test.txt"); osw=new OutputStreamWriter(os); bw=new BufferedWriter(osw); while(true){ Scanner sc=new Scanner(System.in); String str=sc.nextLine(); if(str.equals("quit"))break; bw.write(str); bw.newLine(); } }catch(IOException w){ }finally{ try{ if(bw!=null)bw.close(); }catch(IOException w){ } } } }

将php序列化到数据库的对象饭序列化成java对象

将php序列化到数据库的对象饭序列化成java对象 php的对象序列化到数据库中,形如 a:3:{i:0;i:1241;i:1;i:4;i:2;i:16;}但是java需要取出这样的对象,转换成java的对象/* PHPSerializer.java * * Author: Ma Bingyao * Copyright: https://www.wendangku.net/doc/1617663302.html, * Version: 2.1 * LastModified: 2006-08-09 * This library is free. You can redistribute it and/or modify it. * https://www.wendangku.net/doc/1617663302.html,/?p=202 */ package org.phprpc.util; import java.io.*; import java.util.*; import https://www.wendangku.net/doc/1617663302.html,ng.reflect.*;

class UnSerializeResult { public Object value; public int hv; public UnSerializeResult() {} public UnSerializeResult(Object value, int hv) { this.value = value; this.hv = hv; } } public class PHPSerializer { private static Package[] __packages = Package.getPackages(); private static final byte __Quote = 34; private static final byte __0 = 48; private static final byte __1 = 49; private static final byte __Colon = 58; private static final byte __Semicolon = 59; private static final byte __C = 67; private static final byte __N = 78;

使用json-lib完成json的序列化和反序列化

使用json-lib完成json的序列化和反序列化2011-07-29 14:07:43 分类:默认分类 | 标签:软件 java json. json的序列化和反序列化在现在的javaweb中特别是ajax中使用的比较频繁,现在本人就这种技术提出自己的使用心得。 我的pojo对象的结构是这样的 部门表和员工表 1对多的关系 部门对象 public class Dept implements java.io.Serializable { private Integer depid;//部门ID private String depname;//部门名称 private Set emps = new HashSet(0);//员工集合 } 员工对象 public class Emp implements java.io.Serializable { private Integer empid;//员工id private Dept dept;//部门 private String empname;//员工名称 private Date birthday;//生日 } 1.json字符串序列化成对象 /** *通过json转换成对象 *@author凤生禾予 */ public void jsonToObject(){ Date d=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); StringBuffer str=new StringBuffer(); // json字符串 str.append("{empid:1,dept:{depid:1,depname:'开发部'},empname:'张三 ',birthday:'"+sdf.format(d)+"'}"); // 使用JSONObject将json序列化对象 JSONObject obj=JSONObject.fromObject(str.toString()); // 将JOSNObject对象转换成pojo对象 Emp emp=(Emp) JSONObject.toBean(obj,Emp.class); System.out.println(emp.getBirthday()); } 这里需要注意的是json字符串的写法以{}表示一个对象,字符串必须加引号

vc++实验文档序列化

一、实验目的与任务 掌握文档序列化操作过程。 二、实验涉及的相关知识点 1.文档序列化包括创建空文档、打开文档、保存文档和关闭 文档; 2.Serilize函数的使用; 3.对文档模板字串资源IDR_MAINFRAME内容的含义与修 改 三、实验内容与过程 1.创建一个默认的SDI,命名为Ex_Student; 2.复制以前做好的“学生成绩输入”对话框; 3.复制“学生成绩输入”对话框类CInputDlg; 4.实现ClassWizard对CInputDlg类的支持; 5.添加一个CStudent类并使该类可序列化。打开 EX_StudentDoc.h文件,在class CEx_StudentDoc前添加代 码(附后); 6.添加并处理菜单项。在菜单资源的主菜单中添加顶层菜单 项“学生记录(&S)”,在该顶层菜单项中添加子菜单“添

加(&A)”(ID_STUREC_ADD),并为其添加COMMAND 消息代码(附后); 7.修改CEx_StudentDoc类代码(附后); 8.修改CEx_StudentView类代码(附后); 9.修改文档的字串资源为: EX_CtrlStudent\nSrudentRec\nEX_CtrlStudent\n记录文件 (*.rec)\n.rec\nEXCtrlStudent.Document\nEX_CtrlStudent.Do cument 10.添加一个可序列化类CStuHeader类在Ex_StudentDoc.h文 件中(代码附后); 11.修改Ex_StudentDoc::Serialize代码(附后); 12.编译运行并测试。 四、实验结果及分析 运行后点击菜单栏的“学生记录”下拉列表的“添加”选项,弹出“学生成绩输入”对话框,输入信息点击确认,输入信 息便显示在试图窗口。再次执行上述过程,视图窗口里便追 加一条记录。单击“保存”,可以将信息以指定格式存储。打 击“打开”,可将存储信息重新显示在视图窗口里。

Java-Jackson反序列化漏洞及挖洞思路

源码分析Jackson反序列化漏洞 前言: 本次分析从Java序列化和反序列化源码开始分析,进一步分析Jackson源码,找出造成漏洞的原因,最后以Jackson2.9.2版本,JDK1.80_171,resin4.0.52,CVE-2020-10673为例复现漏洞。 一.JA V A反序列化原理 1.1 Class对象 每一个类都有一个Class对象,Class对象包含每一个类的运行时信息,每一个类都有一个Class对象,每编译一个类就产生一个Class对象,Class类没有公共的构造方法,Class对象是在类加载的时候由JVM以及通过调用类加载器中的DefineClass()方法自动构造的,因此不能显式地声明一个Class对象。在类加载阶段,类加载器首先检查这个类的Class对象是否已经被加载。如果尚未加载,默认的类加载器就会根据类的全限定名查找.class文件。一旦某个类的Class对象被载入内存,我们就可以它来创建这个类的所有对象以及获得这个类的运行时信息。 获得Class对象的方法: 1).Class.forName(“类的全名”);//com.xx.xx.xx 2).实例对象.getClass() 3).类名.class 1.2反射 JA V A反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

实现Java反射机制的类都位于https://www.wendangku.net/doc/1617663302.html,ng.reflect包中: 1).Class类:代表一个类 2).Field类:代表类的成员变量(类的属性) 3).Method类:代表类的方法 4).Constructor类:代表类的构造方法 5).Array类:提供了动态创建数组,以及访问数组的元素的静态方法 简单反射调用代码 Class clz=this.getClass(); Object obj= clz.getMethod("方法名",Class对象序列).invoke(this,Object参数序列); 1.3 反序列化 Java 序列化是指把Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的writeObject() 方法可以实现序列化。 Java 反序列化是指把字节序列恢复为Java 对象的过程,ObjectInputStream 类的readObject() 方法用于反序列化。 RMI:是Java 的一组拥护开发分布式应用程序的API,实现了不同操作系统之间程序的方法调用。值得注意的是,RMI 的传输100% 基于反序列化,Java RMI 的默认端口是1099 端口。 JMX:JMX 是一套标准的代理和服务,用户可以在任何Java 应用程序中使用这些代理和服务实现管理,中间件软件WebLogic 的管理页面就是基于JMX 开发的,而JBoss 则整个系统都基于JMX 构架。 只有实现了Serializable接口的类的对象才可以被序列化,Serializable 接口是启用其序列化功能的接口,实现java.io.Serializable 接口的类才是可序列化的,没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。 readObject() 方法的作用正是从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回,readObject() 是可以重写的,可以定制反序列化的一些行为。 readObject()主要做的事情,其实就是读取正常应该被序列化的字段信息后,

java序列化原理与算法

Java序列化原理和算法 总结: java中序列化算法的顺序: 1、子类的类信息描述 2、子类的字段信息描述(如果遇到类对象的属性,暂时用string的指针表示) 3、父类的类信息描述 4、父类的字段信息描述 5、对父类的字段信息进行赋值 6、对子类的字段信息进行赋值 7、发现子类的字段为类对象时,描述该类对象,并查找该类对象的父类,以以上方式描述,然后赋值。 本文讲解了Java序列化的机制和原理。从文中你可以了解如何序列化一个对象,什么时候需要序列化以及Java序列化的算法。 有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍。 Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization 是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。 序列化的必要性 Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。 这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。如何序列化一个对象 一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。 有了这个标记的Class就能被序列化机制处理。 import java.io.Serializable; class TestSerial implements Serializable { public byte version = 100; public byte count = 0; } 然后我们写个程序将对象序列化并输出。ObjectOutputStream能把Object输出成Byte流。 我们将Byte流暂时存储到temp.out文件里。 public static void main(String args[]) throws IOException { FileOutputStream fos = new FileOutputStream("temp.out");

(1969186)JAVA 面向对象程序设计实验指导书2014级20150124

《Java面向对象程序设计》 实验指导书 (自编教材) 课程代码:1969186 开课院(系)、实验室:华信软件学院实训C509 适用专业:软件工程

实验一数组与类的定义 预习要求:复习Java的两种程序流程结构:分支结构和循环结构;数组的定义、初始化、和使用。初步编好实验程序。 一、实验目的与要求 1、熟悉Java类、对象和方法的一般操作练习等。 2、熟悉数组等的定义和使用。 二、实验内容及步骤 1. 编写Java小应用程序, 程序中自定义一个方法: double find2(int n)方法的功能是求2的n次方。 程序中调用该方法,输出2的40次方的结果并输出。 2.编写Java应用程序, 自定义类Car,类中有4个属性: String name,表示汽车的品牌; String color,表示汽车的颜色; double weight,表示汽车的自重; int price,表示汽车的价格。 要求: 1)在应用程序中创建类Car的4个对象,并通过键盘输入,初始化4个对 象的值,保存在一个数组中。 2)按价格从大到小输出4辆车的信息! 三、实验总结 1)提交实验代码 2)实验过程中的问题以及解决方法分析 3)编写实验报告,在下一次上实验课时提交。

实验二类、对象基础知识 预习要求:复习类的定义;对象和引用变量之间的关系;方法的参数传递和重载;如何使用访问控制符来设计封装良好的类;继承、组合两种类复用机制及各自的优缺点和适用场景。初步编好实验程序。 一、实验目的 1、熟练掌握类、对象的的概念以及对事物的抽象。 2、熟练掌握成员、方法的概念以及构造方法的概念。 3、熟练掌握封装性,多态性的概念 4、理解面向对象的程序设计方法。 二、实验内容与要求 1、定义一个类实现银行帐户的概念,包括的变量有"帐号"和"存款余额",包括的方法有"存款"、"取款"、"查询余额"和”显示帐号”,。定义主类,创建帐户类的对象,并完成相应操作。 提示:关键代码如下: public int getleftmoney(){ return leftmoney; } public void savemoney(double money){ leftmoney+=money; } public void getmoney(double money){ if(money<=leftmoney) leftmoney-=money; else System.out.println("只能取:"+leftmoney); } … bankaccount ba=new bankaccount(888123,1000); ba.savemoney(21000); System.out.println("存入21000元后余额为:"+ba.getleftmoney()); ba.getmoney(11500);

Java序列化的机制和原理

Java序列化的机制和原理 有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍。 Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization 是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。 序列化的必要性 Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。 如何序列化一个对象 一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。有了这个标记的Class就能被序列化机制处理。 1.import java.io.Serializable; 2. 3.class TestSerial implements Serializable { 4. 5.public byte version = 100; 6. 7.public byte count = 0; 8. 9.} 然后我们写个程序将对象序列化并输出。ObjectOutputStream能把Object输出成Byte 流。我们将Byte流暂时存储到temp.out文件里。 1.public static void main(String args[]) throws IOException { 2. 3. FileOutputStream fos = new FileOutputStream("temp.out "); 4. 5. ObjectOutputStream oos = new ObjectOutputStream(fos); 6. 7. TestSerial ts = new TestSerial();

相关文档