`
天_涯_路
  • 浏览: 10045 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

序列化的初步理解

阅读更多

  序列化就是把一个对象固化,怎么理解。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的概念,和这个是一样的意思。

作用

固化一个对象有什么用呢?这个用处可大了。

  1. 像示例中一样,可以把一个对象保存在硬盘中(就是各种文件呀),然后拿着它到处晃悠了。想用的时候再反序列化一下就又回来了。
  2. 把对象弄成文件之后就可以在网络上进行传输了,现在很流行的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网络搭建初步理解1

    本文旨在对 CNN 网络的搭建进行初步理解,涵盖了 CNN 网络的基本参数设定、卷积核的初始化、训练函数的实现、测试函数的实现等方面的知识点。 一、基本参数设定 在建立 CNN 网络时,需要设定基本参数,包括卷积层...

    AUTOSAR R21-11 ComXf规范文档

    它不仅定义了通信数据序列化与反序列化的实现方式,还通过不断的技术迭代和更新,持续优化通信效率、减少错误率、提高系统的兼容性和稳定性。对于从事汽车电子开发的专业人员来说,深入理解并掌握ComXf的相关知识是...

    XStream 1.3 API 手册

    XStream 是一个用 Java 编写的库,它提供了一种简单且高效的方式来序列化和反序列化对象到XML,反之亦然。这个API手册是针对XStream 1.3版本的,包含了详细的使用指南和技术信息,旨在帮助开发者更深入地理解和应用...

    序列图像图像处理使用

    首先,我们要理解序列图像处理的核心目标:从时间维度上分析和理解动态场景。这包括运动检测、物体跟踪、行为识别和场景理解等多个方面。对于这些任务,关键在于如何利用时间信息来增强空间信息的理解。 1. **运动...

    时间序列分析专栏所用数据

    通过深入学习和实践这些知识点,你将能够有效地理解和应用时间序列分析,无论是处理经济指标、股票价格还是其他随时间变化的变量。记得,实际应用中,理解数据背景和业务逻辑同样重要,这将有助于你做出更准确的分析...

    初步实现的php购物车类.zip

    6. **序列化和反序列化**:购物车类可能实现了序列化和反序列化功能,以便在用户会话之间持久保存购物车状态。 7. **数据库交互**:虽然描述中没有明确提及,但实际应用中,购物车类可能会与数据库交互,存储和读取...

    XML初步到精通.rar

    从初步理解XML的语法和结构,到熟练运用.NET提供的XML处理工具,再到深入掌握XPath、XSLT、XML Schema,这一过程需要不断实践和探索。对于初学者来说,逐步积累经验,掌握这些知识点,将有助于提升开发技能和理解...

    DNA序列的分类1

    Fisher准则试图最大化类间距离的同时最小化类内距离,以此实现最佳的分类效果。 文章中提到的方法包括从数据中提取频繁出现的“关键词”,即具有代表性的碱基组合,然后通过最小二乘法确定优先级函数,并通过逐步...

    时间序列及spss教程

    3. **可视化**:绘制时间序列图,直观展示数据的趋势、季节性和异常值。SPSS的图形构建器可以创建线图、面积图等多种图表。 4. **平稳性检验**:时间序列分析往往假设数据是平稳的。通过ADF(Augmented Dickey-...

    时间序列大作业.pdf

    时间序列分析的目标是理解并预测未来数据点的行为。时间序列数据的分析可以应用于多种场景,包括经济预测、库存管理、股票市场分析、天气预报等领域。 ARIMA模型是一种用于分析和预测时间序列数据的统计模型,全称...

    DNAMAN序列分析软件

    此外,软件还能进行简单的三维结构建模,虽然可能不如专门的结构预测软件精确,但对初步理解蛋白质结构仍非常有帮助。 最后,DNAMAN在教学和协作方面也很便捷。用户可以创建项目文件,将所有相关的序列、比对结果和...

    使用asp.net与长连接技术制作网页聊天工具(初步)

    3. **消息序列化与反序列化**:数据在客户端和服务器之间传输时,可能需要进行序列化和反序列化操作。 4. **错误处理**:处理可能出现的网络中断、服务器故障等问题,并提供适当的反馈。 5. **性能优化**:合理设置...

    预测模型-时间序列分析

    2. 数据探索:对数据进行初步的可视化和统计分析,识别出数据中的趋势(trend)、周期性(seasonality)、季节指数(seasonal index)以及随机性(random variation)。这通常通过绘制数据图表、计算自相关函数...

    以C语言为例的计算机算法初步

    计算机算法是计算机科学中的核心概念,它是解决问题的精确步骤序列,可以用计算机程序来实现。C语言作为一种强大的编程语言,常常被用来描述和实现算法。本文将以C语言为载体,探讨算法的初步概念以及两种常见的算法...

    网格序列法实现等值线生成

    通过学习这个实验,我们可以掌握网格序列法生成等值线的基本流程,了解科学可视化的重要性和实用技巧,这对于理解和研究各种科学问题是非常有益的。同时,这也是提升编程技能和数据分析能力的好机会,特别是对于使用...

    时间序列_matlab_时间序列预测_移动平均算法_describellf_

    时间序列分析是统计学中的一个重要领域,特别是在处理连续或定期数据时,如股票价格、气温变化、销售数据等。在MATLAB中,时间序列预测是一种...尽管如此,SMA仍然是理解时间序列预测基础和进行初步分析的有效工具。

    jackson2.6

    一、序列化和反序列化的增强 在Jackson 2.6中,序列化和反序列化过程得到了显著提升。例如,新增了`@JsonInclude(Include.NON_NULL)`注解,允许用户在序列化时自动忽略值为null的属性,从而减少无用的数据传输。此外...

    数学建模学习方法-DNA序列的统计分析.doc

    【数学建模学习方法-DNA序列的统计分析】 在数学建模中,DNA序列的统计分析是一种关键的技术,用于揭示生物信息学...模型一和模型二的结合使用,可以提高序列分类的准确性和深度,为理解和利用DNA信息提供了有效手段。

    汽车数据_时间序列.rar_increaseeoo_季节项_时间序列_时间序列分析

    Excel是数据处理的常用工具,用户可以在这里查看和整理数据,或者利用内置的图表功能初步分析时间序列。 总的来说,这个项目涉及到了使用MATLAB进行时间序列分析,重点关注数据的季节性和增长趋势。通过对"cardata....

Global site tag (gtag.js) - Google Analytics