java提高(6)---Serializable
Serializable--初解
一 序列化是干什么的?
我们知道,在jvm中引用数据类型存在于栈中,而new创建出的对象存在于堆中。如果电脑断电那么存在于内存中的对象就会丢失。那么有没有方法将对象保存到磁盘(对象持久化存储)或通过网络传输到远处的其他地方呢?
答案是可以,但是我们必须要求所有支持持久化存储的类实现Serializable接口。Serializable就像个通行证,只有持有这个通行证,jvm才让类创建的对象进行持久化。这个接口将类与一个称为serialVersionUID的变量关联起来,这个serialVersionUID就是在反序列化中用来确定由哪个类来加载这个对象。
二、什么情况下需要序列化
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
三、JavaBean为什么要实现java.io.Serializable接口实现序列化?
找了个比较好理解的例子:客户端访问了某个能开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间。如果在某一时间段内访问站点的用户很多,web服务器内存中就会积累大量的HttpSession对象,消耗大量的服务器内存,即使用户已经离开或者关闭了浏览器,web服务器仍要保留与之对应的HttpSession对象,在他们超时之前,一直占用web服务器内存资源。
web服务器通常将那些暂时不活动但未超时的HttpSession对象转移到文件系统或数据库中保存,服务器要使用他们时再将他们从文件系统或数据库中装载入内存,这种技术称为Session的持久化。
将HttpSession对象保存到文件系统或数据库中,需要采用序列化的方式将HttpSession对象中的每个属性对象保存到文件系统或数据库中;将HttpSession对象从文件系统或数据库中装载如内存时,需要采用反序列化的方式,恢复HttpSession对象中的每个属性对象。所以存储在HttpSession对象中的每个属性对象必须实现Serializable接口。当然如果不是存储在session中的JavaBean可以不用存储哈。
举个简单例子:
Student
- import java.io.Serializable;
- public class Student implements Serializable {
- /*serialVersionUID来决定由哪个类来加载存在于文件中的对象
- * 如果指定serialVersionUID的数值,那就能使得其不再与类的成员变量相关联
- * 不然你已经把对象保存到数据库,这个时候你再给这个对象新增属性,那么反序列化
- * 就会报:本地类不匹配的错误,但如果指定serialVersionUID值那就不会报错。
- */
- private static final long serialVersionUID = -5182532647273106745L;
- //成员变量写成static的话是不能被持久化的
- public static String countryName="china";
- private String name;
- private int age;
- //如果想对非静态的数据也不想序列化,则需要加入关键字
- transient String sex;
- /* 提供set和get方法,无参和有参方法*/
- }
测试类
- import java.io.*;
- public class SerializableTest {
- public static void main(String[] args) {
- writeObj();
- readObj();
- }
- public static void writeObj()
- {
- Student student=new Student("小筱", 1, "女");
- try {
- ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("d:\\student.txt"));
- oos.writeObject(student);
- oos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void readObj()
- {
- try {
- ObjectInputStream ooi=new ObjectInputStream(new FileInputStream("d:\\student.txt"));
- try {
- Object obj=ooi.readObject();
- Student student=(Student)obj;
- System.out.println("age:"+student.getAge()+",name:"+student.getName()+",countryName:"+student.countryName+",sex:"+student.getSex());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- ooi.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
第二个小例子我没有亲自测试:用套接字在网络上传送对象
1.首先建立要传输的对象
- //建立用来持续化的对象
- import java.io.Serializable;
- public class ObjectSeri implements Serializable{
- //成员变量写成static的话是不能被持久化的
- //private关键字是不能被持久化的,脱离了JVM,成员变量是不在JVM的安全机制之内
- private String name;
- private String age;
- /*set和get方法*/ <span style="color:#333333;"><strong>
- </strong></span>
2.有了传输的对象,下一步就是建立一个服务端线程来监听socket端口,并且在run方法里面实现读取对象的数据
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- //serverTest类继承thread类,监听端口来的信息
- public class serverTest extends Thread {
- // private final String serverIP = "127.0.0.1";
- private final int serverPort = 3400;
- private ServerSocket server;
- public serverTest() {
- try {
- // ServerSocket server=new ServerSocket(serverPort);
- server = new ServerSocket(serverPort);
- System.out.println("正在监听3400端口");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void run() {
- Socket socket = null;
- ObjectInputStream in;
- while (true) {
- try {
- synchronized (server) {
- socket = server.accept();
- }
- System.out.println("当前的连接是:"
- + socket.getInetAddress().toString());
- socket.setSoTimeout(20000);
- in = new ObjectInputStream(socket.getInputStream());
- ObjectSeri data = (ObjectSeri) in.readObject();
- System.out.println("The name is:" + data.getName()
- + "and age is:" + data.getAge());
- in.close();
- in = null;
- socket.close();
- } catch (IOException | ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- }
- public static void main(String args[]) {
- (new serverTest()).start();
- }
3.最后,建立一个客户端来测试下
- import java.io.ObjectOutputStream;
- import java.net.InetSocketAddress;
- import java.net.Socket;
- //建立一个client测试类
- public class TestClient {
- private String address = "127.0.0.1";
- private int port = 3400;
- public TestClient() {
- // Prepare the data need to transmit
- ObjectSeri data = new ObjectSeri();
- data.setName("Scott");
- data.setAge("34");
- Socket client = new Socket();
- InetSocketAddress adr = new InetSocketAddress(this.address, this.port);
- try {
- client.connect(adr, 10000);
- ObjectOutputStream out = new ObjectOutputStream(
- client.getOutputStream());
- // send object
- out.writeObject(data);
- out.flush();
- out.close();
- out = null;
- data = null;
- client.close();
- client = null;
- } catch (java.io.IOException e) {
- System.out.println("IOException :" + e.toString());
- }
- }
- public static void main(String[] args) {
- new TestClient();
- }
- } <span style="color: rgb(51, 51, 51);"> </span>
输出结果如下:
正在监听3400端口
当前的连接是:/127.0.0.1
The name is:Scottand age is:34
今天:2017:12:05 发现自己用到了,就是jquery表单提交,用post提交,这样有个最大的好处,就是我不用一个值一个值提交,而是把表单提交过去
- $.post('your url', $("form").serialize(), function(data) {
- // your code
- }
- });
小筱的窝:水滴石穿,成功的速度一定要超过父母老去的速度! 少尉【2】
java提高(6)---Serializable的更多相关文章
- 【java提高】Serializable(一)--初步理解
Serializable(一)--初步理解 一 序列化是干什么的? 我们知道,在jvm中引用数据类型存在于栈中,而new创建出的对象存在于堆中.如果电脑断电那么存在于内存中的对象就会丢失.那么有没有方 ...
- Java提高篇——对象克隆(复制)
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- java提高篇(二九)-----Vector
在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...
- Java提高篇(二八)------TreeSet
与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...
- Java提高篇(二七)-----TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
- java提高篇(二四)-----HashSet
在前篇博文中(java提高篇(二三)-----HashMap)详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素. ...
- java提高篇(十九)-----数组之二
前面一节主要介绍了数组的基本概念,对什么是数组稍微深入了一点点,在这篇博文中主要介绍数组的其他方面. 三.性能?请优先考虑数组 在java中有很多方式来存储一系列数据,而且在操作上面比数组方便的多?但 ...
- Java提高篇---TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
- java提高篇(二二)-----LinkedList
摘自http://blog.csdn.net/chenssy/article/details/18099417 java提高篇(二二)-----LinkedList 一.概述 LinkedList与 ...
- Java中的Serializable接口和transient关键字
Java中的Serializable接口和transient关键字 Table of Contents 1. 向memcached中放数据时遇到NotSerializableException异常 2 ...
随机推荐
- vue使用中遇到的,以及vue1.0到vue2.0新手踩的坑
最近再写一个vue的项目,视频中用的是vue1.0,但是现在vue已经2.0,所以踩了很多坑,先记录下来.理解有误再来修改. 路由问题 之前的路由是写在app.vue里边,而2.0的路由直接有个rou ...
- springcloud+zuul+swagger 分布式接口文档
https://gitee.com/didispace/swagger-butler 1.引用上面项目中的swagger 工具包 2.zuul 网关配置 zuul.routes.api-apiserv ...
- 2019浙江省赛B zoj4101 Element Swapping(推公式)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6003 题意 \(数组a通过交换一对数字,得到了b数组,给出x=\sum^n_{ ...
- docker之tomcat简单部署
将apache-tomcat-8.0.36.tar.gz及jdk-7u79-linux-x64.gz拷贝到创建的tomcat8目录下 在tomcat8目录下创建Dockerfile文件 在Docker ...
- PowerShell工作流学习-7-编写脚本工作流帮助
关键点: a)工作流中不支持基于注释的帮助(标识工作流的帮助文件的 .ExternalHelp 注释除外). b)支持get-help参数的方式:使用 .ExternalHelp 注释以便 Get-H ...
- Oracle去除重复(某一列的值重复),取最新(日期字段最新)的一条数据
转自 : http://blog.csdn.net/nux_123/article/details/45037719 问题:在项目中有一张设备检测信息表DEVICE_INFO_TBL, 每个设备每天都 ...
- influence maximization 第二弹
Robust Influence Maximization 首先简要介绍一下这个问题:在一个社交网络图中寻找固定数量的节点,使得这些节点对所有节点的影响值尽可能的大.先对这个问题给出形式化的定义:给一 ...
- VUE最佳实践
vuex 作为model数据请求由action来获取,页面组建级的发送action,返回promise给组建使用,如果使用周期较长需comit到mutation保存到state. 数据分模块,根据业务 ...
- Linux启动流程和脚本服务-6
授课笔记:----------------------------------- linux系统启动流程:一.初始化阶段:1.grub引导界面2.识别硬件3.初始化驱动 二.加载/etc/rc.d/r ...
- Python小练习之寻找101到200之间的素数
方法1:from math import * def primeNumber(start,end): num = 0 for i in range(start,end): flag = 0 for j ...