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 ...
随机推荐
- Tomcat 500error: Could not initialize class
Web 项目报错Could not initialize class ,出现500,说明服务器是起来了,可能是这个类的驱动有问题,缺少初始化需要的文件 查到有相关情况: 考虑是jar 包的问题,检查了 ...
- mysql 慢日志分析
mysql 调优首先需要找到那些有问题的SQL语句. 怎么找到这些语句呢? mysql 提供了很方便的功能. 1.慢日志 在my.cnf 文件中,增加如下配置 log-error ...
- linux nfs远程挂载和卸载
一.nfs远程挂载 1.首先确定服务端(实体挂载节点)的IP 2.通过cat /etc/hosts 查看服务端的server name 3.mount -t nfs servername:/挂载文件 ...
- 不支持find_element_by_name元素定位方法,抛不支持find_element_by_name元素定位方法,会抛如下错误 org.openqa.selenium.InvalidSelectorException: Locator Strategy 'name' is not supported for this session的解决
appium1.5后不支持find_element_by_name元素定位方法,会抛如下错误 org.openqa.selenium.InvalidSelectorException: Locator ...
- 26.HashCode
在前面三篇博文中讲解了(HashMap.HashSet.HashTable),在其中不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最精华的部分,所以 ...
- Codeforces Round #425 (Div. 2)
A 题意:给你n根棍子,两个人每次拿m根你,你先拿,如果该谁拿的时候棍子数<m,这人就输,对手就赢,问你第一个拿的人能赢吗 代码: #include<stdio.h>#define ...
- 写在HTTP协议之前
1.网络模型 OSI模型即:开放系统互连参考模型(Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参 ...
- Openvswitch手册(4): Mirror
这一节我们来分析Mirror Mirror就是配置一个bridge,将某些包发给指定的mirrored ports 对于包的选择: select_all,所有的包 select_dst_port se ...
- Openvswitch手册(5): VLAN and Bonding
我们这一节来看Port 一般来说一个Port就是一个Interface,当然也有一个Port对应多个Interface的情况,成为Bond VLAN Configuration Port的一个重要的方 ...
- optimizer
在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是 Adam,为什么呢? 下面是 TensorFlow 中的优化器, https://www.tensorflow.org/api_guide ...