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

  1. import java.io.Serializable;
  2. public class Student implements Serializable {
  3. /*serialVersionUID来决定由哪个类来加载存在于文件中的对象
  4. * 如果指定serialVersionUID的数值,那就能使得其不再与类的成员变量相关联
  5. * 不然你已经把对象保存到数据库,这个时候你再给这个对象新增属性,那么反序列化
  6. * 就会报:本地类不匹配的错误,但如果指定serialVersionUID值那就不会报错。
  7. */
  8. private static final long serialVersionUID = -5182532647273106745L;
  9.  
  10. //成员变量写成static的话是不能被持久化的
  11. public static String countryName="china";
  12. private String name;
  13. private int age;
  14. //如果想对非静态的数据也不想序列化,则需要加入关键字
  15. transient String sex;
  16. /* 提供set和get方法,无参和有参方法*/
  17. }

测试类

  1. import java.io.*;
  2. public class SerializableTest {
  3. public static void main(String[] args) {
  4. writeObj();
  5. readObj();
  6. }
  7. public static void writeObj()
  8. {
  9. Student student=new Student("小筱", 1, "女");
  10. try {
  11. ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("d:\\student.txt"));
  12. oos.writeObject(student);
  13. oos.close();
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. public static void readObj()
  19. {
  20. try {
  21. ObjectInputStream ooi=new ObjectInputStream(new FileInputStream("d:\\student.txt"));
  22. try {
  23. Object obj=ooi.readObject();
  24. Student student=(Student)obj;
  25. System.out.println("age:"+student.getAge()+",name:"+student.getName()+",countryName:"+student.countryName+",sex:"+student.getSex());
  26. } catch (ClassNotFoundException e) {
  27. e.printStackTrace();
  28. }
  29. ooi.close();
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }

第二个小例子我没有亲自测试:用套接字在网络上传送对象

1.首先建立要传输的对象

  1. //建立用来持续化的对象
  2. import java.io.Serializable;
  3. public class ObjectSeri implements Serializable{
  4.  
  5. //成员变量写成static的话是不能被持久化的
  6. //private关键字是不能被持久化的,脱离了JVM,成员变量是不在JVM的安全机制之内
  7. private String name;
  8. private String age;
  9. /*set和get方法*/ <span style="color:#333333;"><strong>
  10. </strong></span>

2.有了传输的对象,下一步就是建立一个服务端线程来监听socket端口,并且在run方法里面实现读取对象的数据

  1. import java.io.IOException;
  2. import java.io.ObjectInputStream;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. //serverTest类继承thread类,监听端口来的信息
  6. public class serverTest extends Thread {
  7. // private final String serverIP = "127.0.0.1";
  8. private final int serverPort = 3400;
  9. private ServerSocket server;
  10. public serverTest() {
  11. try {
  12. // ServerSocket server=new ServerSocket(serverPort);
  13. server = new ServerSocket(serverPort);
  14. System.out.println("正在监听3400端口");
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. public void run() {
  20. Socket socket = null;
  21. ObjectInputStream in;
  22. while (true) {
  23. try {
  24. synchronized (server) {
  25. socket = server.accept();
  26. }
  27. System.out.println("当前的连接是:"
  28. + socket.getInetAddress().toString());
  29. socket.setSoTimeout(20000);
  30. in = new ObjectInputStream(socket.getInputStream());
  31. ObjectSeri data = (ObjectSeri) in.readObject();
  32. System.out.println("The name is:" + data.getName()
  33. + "and age is:" + data.getAge());
  34. in.close();
  35. in = null;
  36. socket.close();
  37. } catch (IOException | ClassNotFoundException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }
  42. public static void main(String args[]) {
  43. (new serverTest()).start();
  44. }

3.最后,建立一个客户端来测试下

  1. import java.io.ObjectOutputStream;
  2. import java.net.InetSocketAddress;
  3. import java.net.Socket;
  4. //建立一个client测试类
  5. public class TestClient {
  6. private String address = "127.0.0.1";
  7. private int port = 3400;
  8.  
  9. public TestClient() {
  10. // Prepare the data need to transmit
  11. ObjectSeri data = new ObjectSeri();
  12. data.setName("Scott");
  13. data.setAge("34");
  14. Socket client = new Socket();
  15. InetSocketAddress adr = new InetSocketAddress(this.address, this.port);
  16. try {
  17. client.connect(adr, 10000);
  18. ObjectOutputStream out = new ObjectOutputStream(
  19. client.getOutputStream());
  20. // send object
  21. out.writeObject(data);
  22. out.flush();
  23. out.close();
  24. out = null;
  25. data = null;
  26. client.close();
  27. client = null;
  28. } catch (java.io.IOException e) {
  29.  
  30. System.out.println("IOException :" + e.toString());
  31. }
  32. }
  33. public static void main(String[] args) {
  34. new TestClient();
  35. }
  36. } <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提交,这样有个最大的好处,就是我不用一个值一个值提交,而是把表单提交过去

  1. $.post('your url', $("form").serialize(), function(data) {
  2. // your code
  3. }
  4. });

小筱的窝:水滴石穿,成功的速度一定要超过父母老去的速度! 少尉【2】

java提高(6)---Serializable的更多相关文章

  1. 【java提高】Serializable(一)--初步理解

    Serializable(一)--初步理解 一 序列化是干什么的? 我们知道,在jvm中引用数据类型存在于栈中,而new创建出的对象存在于堆中.如果电脑断电那么存在于内存中的对象就会丢失.那么有没有方 ...

  2. Java提高篇——对象克隆(复制)

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  3. java提高篇(二九)-----Vector

    在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...

  4. Java提高篇(二八)------TreeSet

    与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...

  5. Java提高篇(二七)-----TreeMap

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  6. java提高篇(二四)-----HashSet

          在前篇博文中(java提高篇(二三)-----HashMap)详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素. ...

  7. java提高篇(十九)-----数组之二

    前面一节主要介绍了数组的基本概念,对什么是数组稍微深入了一点点,在这篇博文中主要介绍数组的其他方面. 三.性能?请优先考虑数组 在java中有很多方式来存储一系列数据,而且在操作上面比数组方便的多?但 ...

  8. Java提高篇---TreeMap

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  9. java提高篇(二二)-----LinkedList

    摘自http://blog.csdn.net/chenssy/article/details/18099417  java提高篇(二二)-----LinkedList 一.概述 LinkedList与 ...

  10. Java中的Serializable接口和transient关键字

    Java中的Serializable接口和transient关键字 Table of Contents 1. 向memcached中放数据时遇到NotSerializableException异常 2 ...

随机推荐

  1. vue使用中遇到的,以及vue1.0到vue2.0新手踩的坑

    最近再写一个vue的项目,视频中用的是vue1.0,但是现在vue已经2.0,所以踩了很多坑,先记录下来.理解有误再来修改. 路由问题 之前的路由是写在app.vue里边,而2.0的路由直接有个rou ...

  2. springcloud+zuul+swagger 分布式接口文档

    https://gitee.com/didispace/swagger-butler 1.引用上面项目中的swagger 工具包 2.zuul 网关配置 zuul.routes.api-apiserv ...

  3. 2019浙江省赛B zoj4101 Element Swapping(推公式)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6003 题意 \(数组a通过交换一对数字,得到了b数组,给出x=\sum^n_{ ...

  4. docker之tomcat简单部署

    将apache-tomcat-8.0.36.tar.gz及jdk-7u79-linux-x64.gz拷贝到创建的tomcat8目录下 在tomcat8目录下创建Dockerfile文件 在Docker ...

  5. PowerShell工作流学习-7-编写脚本工作流帮助

    关键点: a)工作流中不支持基于注释的帮助(标识工作流的帮助文件的 .ExternalHelp 注释除外). b)支持get-help参数的方式:使用 .ExternalHelp 注释以便 Get-H ...

  6. Oracle去除重复(某一列的值重复),取最新(日期字段最新)的一条数据

    转自 : http://blog.csdn.net/nux_123/article/details/45037719 问题:在项目中有一张设备检测信息表DEVICE_INFO_TBL, 每个设备每天都 ...

  7. influence maximization 第二弹

    Robust Influence Maximization 首先简要介绍一下这个问题:在一个社交网络图中寻找固定数量的节点,使得这些节点对所有节点的影响值尽可能的大.先对这个问题给出形式化的定义:给一 ...

  8. VUE最佳实践

    vuex 作为model数据请求由action来获取,页面组建级的发送action,返回promise给组建使用,如果使用周期较长需comit到mutation保存到state. 数据分模块,根据业务 ...

  9. Linux启动流程和脚本服务-6

    授课笔记:----------------------------------- linux系统启动流程:一.初始化阶段:1.grub引导界面2.识别硬件3.初始化驱动 二.加载/etc/rc.d/r ...

  10. Python小练习之寻找101到200之间的素数

    方法1:from math import * def primeNumber(start,end): num = 0 for i in range(start,end): flag = 0 for j ...