序列化就是把一个对象固化,怎么理解。java中一个对象,比如Person person = new Person(),通过new出一个person对象之后,如果你关闭了JVM(比如说关闭了eclipse),如果你还想用person对象怎么办?简单,我们重新new一个新的一模一样的对象,但是我们必须要上次new这个Person的属性,比如name,sex等,并且这个新new的对象也不可能一模一样的,因为他们是不同时间new出来的,也许这个时间间隔里面JVM还发生变化了呢。
所以我们需要有一种机制把person永久的保存下来,那就是序列化。通过什么办法序列化,我们最好理解的就是把person记录在一个文档里面(比如txt文件),这样子我下次使用就根据保存的这个txt文件通过程序再次读入程序就行了,这个过程就叫做反序列化。
请看示例,示例的目的是序列化一个Perosn对象,然后再反序列化回来。
定义person对象
package test.vo; import java.io.Serializable; /** * 对象要想被序列化,必须实现Serializable接口 * @author tim.syh * */ public class Person implements Serializable{ private static final long serialVersionUID = -7142264207488774373L; private String name; private int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
序列化和反序列化
package test.serializable; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import test.vo.Person; public class TestSerializale { public static void main(String[] args) throws Exception{ //定义一个person对象 Person person = new Person("tim", 20); //序列化对象到path目录下,可以看到执行完成之后在D:/temp目录下多了一个person.txt文件 String path = "D:/temp/person.txt"; serialiobject(person, path); //执行完上面的之后,你可以关闭掉eclipse甚至跑到你隔壁的电脑去执行反序列化的代码 //当然如果你要去隔壁电脑执行,需要把person.txt文件也拷贝过去哈 Person p = deSerialiobject("D:/temp/person.txt"); //打印下结果是 :Person [name=tim, age=20],perosn的信息又回来了。 System.out.println(p); } /** * 序列化Person对象,生成的字节流存放path目录下去 * @param person */ private static void serialiobject(Person person, String path) throws Exception{ //jdk自带的序列化类,把person对象写入到path目录下的文件中 ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(path)); oo.writeObject(person); oo.close(); System.out.println("对象序列化成功"); } /** * 从文件中去读取对象。 * @param path 已经序列化的文件的目录 * @return Person对象 */ private static Person deSerialiobject(String path) throws Exception{ //jdk自带的反序列化类,又把path路径下文件的内容读回成一个对象 ObjectInputStream oi = new ObjectInputStream(new FileInputStream(path)); Person p = (Person)oi.readObject(); oi.close(); System.out.println("对象反序列化成功!"); return p; } }
你可以自己做实验,当把一个对象序列化之后,你明天再来反序列化,还能够得到昨天新建对象person的信息,这是不是相当于把person这个对象的信息给固化了,这个让你想到了什么?对,ORM的概念,和这个是一样的意思。
作用
固化一个对象有什么用呢?这个用处可大了。
- 像示例中一样,可以把一个对象保存在硬盘中(就是各种文件呀),然后拿着它到处晃悠了。想用的时候再反序列化一下就又回来了。
- 把对象弄成文件之后就可以在网络上进行传输了,现在很流行的websercie首先就是要实现对象能够这样子序列化才行。
方式
序列化有很多方式,比如例子中说道的jdk自带的ObjectOutputStream对象(示例就是)啦,其他的第三方的比如比较常见的hessian,Google的Protocal Buffers呀,他们比jdk自带的效率高一些。其实还有更常用的方式那就是xml和json呀。
说到常用的xml和json,原来也是序列化的一种呀,当然是呀,一个xml和json文件的内容你都可以看成是一个个已经固话的对象,然后就可以进行保存,传输了,如果要用这些对象的时候反序列就OK了。
xml和json
在java web系统中,我们经常需要把person对象从A系统传到B系统进行处理,比如webservice这种远程调用,当然,他们已经帮我们实现了这部分网络传输的部分,对于我们来说,就相当是把person对象从A系统通过网络运输到B系统去了,但是实际它在运输之前,肯定要首先把person对象序列化成文本或者流的形式(就是二进制码,文本你要传输最终不也是要转成二进制进行传输吗)运送到B系统,B系统再进行反序列化从而拿到person对象。
SOUP协议就是用xml的形式传递对象数据,不过现在json越来越流行了,毕竟用xml来传递数据的soup协议比起轻量级的json来说,还是显得臃肿了一点。不过只要你理解了序列化的本质,无所谓用什么形式传输啦。
技术就是这样子,理解了可以随便玩。
相关推荐
本文旨在对 CNN 网络的搭建进行初步理解,涵盖了 CNN 网络的基本参数设定、卷积核的初始化、训练函数的实现、测试函数的实现等方面的知识点。 一、基本参数设定 在建立 CNN 网络时,需要设定基本参数,包括卷积层...
它不仅定义了通信数据序列化与反序列化的实现方式,还通过不断的技术迭代和更新,持续优化通信效率、减少错误率、提高系统的兼容性和稳定性。对于从事汽车电子开发的专业人员来说,深入理解并掌握ComXf的相关知识是...
XStream 是一个用 Java 编写的库,它提供了一种简单且高效的方式来序列化和反序列化对象到XML,反之亦然。这个API手册是针对XStream 1.3版本的,包含了详细的使用指南和技术信息,旨在帮助开发者更深入地理解和应用...
首先,我们要理解序列图像处理的核心目标:从时间维度上分析和理解动态场景。这包括运动检测、物体跟踪、行为识别和场景理解等多个方面。对于这些任务,关键在于如何利用时间信息来增强空间信息的理解。 1. **运动...
通过深入学习和实践这些知识点,你将能够有效地理解和应用时间序列分析,无论是处理经济指标、股票价格还是其他随时间变化的变量。记得,实际应用中,理解数据背景和业务逻辑同样重要,这将有助于你做出更准确的分析...
6. **序列化和反序列化**:购物车类可能实现了序列化和反序列化功能,以便在用户会话之间持久保存购物车状态。 7. **数据库交互**:虽然描述中没有明确提及,但实际应用中,购物车类可能会与数据库交互,存储和读取...
从初步理解XML的语法和结构,到熟练运用.NET提供的XML处理工具,再到深入掌握XPath、XSLT、XML Schema,这一过程需要不断实践和探索。对于初学者来说,逐步积累经验,掌握这些知识点,将有助于提升开发技能和理解...
Fisher准则试图最大化类间距离的同时最小化类内距离,以此实现最佳的分类效果。 文章中提到的方法包括从数据中提取频繁出现的“关键词”,即具有代表性的碱基组合,然后通过最小二乘法确定优先级函数,并通过逐步...
3. **可视化**:绘制时间序列图,直观展示数据的趋势、季节性和异常值。SPSS的图形构建器可以创建线图、面积图等多种图表。 4. **平稳性检验**:时间序列分析往往假设数据是平稳的。通过ADF(Augmented Dickey-...
时间序列分析的目标是理解并预测未来数据点的行为。时间序列数据的分析可以应用于多种场景,包括经济预测、库存管理、股票市场分析、天气预报等领域。 ARIMA模型是一种用于分析和预测时间序列数据的统计模型,全称...
此外,软件还能进行简单的三维结构建模,虽然可能不如专门的结构预测软件精确,但对初步理解蛋白质结构仍非常有帮助。 最后,DNAMAN在教学和协作方面也很便捷。用户可以创建项目文件,将所有相关的序列、比对结果和...
3. **消息序列化与反序列化**:数据在客户端和服务器之间传输时,可能需要进行序列化和反序列化操作。 4. **错误处理**:处理可能出现的网络中断、服务器故障等问题,并提供适当的反馈。 5. **性能优化**:合理设置...
2. 数据探索:对数据进行初步的可视化和统计分析,识别出数据中的趋势(trend)、周期性(seasonality)、季节指数(seasonal index)以及随机性(random variation)。这通常通过绘制数据图表、计算自相关函数...
计算机算法是计算机科学中的核心概念,它是解决问题的精确步骤序列,可以用计算机程序来实现。C语言作为一种强大的编程语言,常常被用来描述和实现算法。本文将以C语言为载体,探讨算法的初步概念以及两种常见的算法...
通过学习这个实验,我们可以掌握网格序列法生成等值线的基本流程,了解科学可视化的重要性和实用技巧,这对于理解和研究各种科学问题是非常有益的。同时,这也是提升编程技能和数据分析能力的好机会,特别是对于使用...
时间序列分析是统计学中的一个重要领域,特别是在处理连续或定期数据时,如股票价格、气温变化、销售数据等。在MATLAB中,时间序列预测是一种...尽管如此,SMA仍然是理解时间序列预测基础和进行初步分析的有效工具。
一、序列化和反序列化的增强 在Jackson 2.6中,序列化和反序列化过程得到了显著提升。例如,新增了`@JsonInclude(Include.NON_NULL)`注解,允许用户在序列化时自动忽略值为null的属性,从而减少无用的数据传输。此外...
【数学建模学习方法-DNA序列的统计分析】 在数学建模中,DNA序列的统计分析是一种关键的技术,用于揭示生物信息学...模型一和模型二的结合使用,可以提高序列分类的准确性和深度,为理解和利用DNA信息提供了有效手段。
Excel是数据处理的常用工具,用户可以在这里查看和整理数据,或者利用内置的图表功能初步分析时间序列。 总的来说,这个项目涉及到了使用MATLAB进行时间序列分析,重点关注数据的季节性和增长趋势。通过对"cardata....