网站首页 > java教程 正文
Java提供了一种对象序列化的机制,指的就是将一个对象表示成一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中的数据类型信息。然后将其写入文件中或者数据库中以保存,如果需要使用它时,在通过反序列化的方式拿到它,其包换的信息依旧能够获得。
为什么我们需要序列化对象?
当需要将对象存入到网络中、文件中、数据库中的时候,就需要序列化对象。网络设备和存储设备只能理解位和字节,而不能理解对象,序列化将对象转化成字节就可以网络发送或者存入内存了。

为什么我们需要将对象储存或者传递?
1. 对象创建取决于很多上下文,一旦创建,其他的组件就需要它的方法或者字段;
2. 当对象创建后,我们不确定使用哪个字段,因此将其存储到数据库以便以后的数据分析。
序列化和反序列化例子如下:
public class SerializationTest {
	 public static void main(String[] args){
	 Bird bird = new Bird();
	 bird.setName("shane");
	 bird.setColor("read");
	 bird.setWeight(2.3);
	
	 //序列化对象
	 try {
	 FileOutputStream fileOutputStream = new FileOutputStream("c:/bird.ser");
	 ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
	 objectOutputStream.writeObject(bird);
	 objectOutputStream.close();
	 fileOutputStream.close();
	 System.out.println("序列化Bird被写入了文件/bird.ser中。");
	 } catch (IOException e) {
	 e.printStackTrace();
	 }
	
	 //去序列化
	 bird = null;
	 try {
	 FileInputStream fileInputStream = new FileInputStream("c:/bird.ser");
	 ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
	 bird = (Bird)objectInputStream.readObject();
	 } catch (IOException e) {
	 e.printStackTrace();
	 } catch (ClassNotFoundException e) {
	 e.printStackTrace();
	 }
	 System.out.println("bird的名字是: " + bird.getName());
	 System.out.println("bird的颜色是: " + bird.getColor());
	 System.out.println("bird的重量是: " + bird.getWeight());
	
	 bird.introduce();
	 }
	}
	class Bird implements Serializable{
	 private static final long serialVersionUID = -5742822984616863149L;
	 private String name;
	 private String color;
	 private transient double weight;//表示序列化过程不会对字段weight操作
	
	 public String getName() {
	 return name;
	 }
	
	 public void setName(String name) {
	 this.name = name;
	 }
	
	 public String getColor() {
	 return color;
	 }
	
	 public void setColor(String color) {
	 this.color = color;
	 }
	
	 public double getWeight() {
	 return weight;
	 }
	
	 public void setWeight(double weight) {
	 this.weight = weight;
	 }
	
	 public void introduce(){
	 System.out.println("I hava a " + name + " " + color + " bird.");
	 }
	}
终端输出结果为:
输关于序列化的几点总结:
(1)一个类的对象想要被序列化,需要满足两个条件:1)该类必须实现java.io.Serializable接口;2)该类的所有属性必须是可序列化的,如上述例子,属性weight被声明为transient时,该属性是不能随对象保存的,当对该类序列化时,会自动忽略transient修饰的字段;
(2)当序列化一个对象到文件系统时,按照Java的标准约定是给文件一个.ser扩展名;
(3)当序列化时,ObjectOutputStream类是用来序列化的数据流,writeObject(Object object)方法将对象写入流中;当反序列化时,ObjectInputStream类是用来序列化的数据流,readObject()返回读取的对象。
猜你喜欢
- 2024-10-08 Java核心知识 基础六 JAVA序列化(创建可复用的Java对象)
- 2024-10-08 java中的序列化(JAVA中的序列化)
- 2024-10-08 Java 面试题之 序列化和反序列化的深入理解
- 2024-10-08 Oracle:Java 的序列化就是个错误,我们要删掉它!
- 2024-10-08 java序列化和反序列化实例详解(java序列化和反序列化实例详解区别)
- 2024-10-08 java对象序列化(java对象序列化到文件)
- 2024-10-08 实战案例:轻松搞定Java两种序列化机制
- 2024-10-08 java序列化机制之protobuf(快速高效跨语言)
- 2024-10-08 Java路径-40-Java序列化(未检测到java sdk环境请在配置中添加sdk安装路径)
- 2024-10-08 java序列化知多少(java序列化怎么实现)
欢迎 你 发表评论:
- 最近发表
- 标签列表
- 
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
 

本文暂时没有评论,来添加一个吧(●'◡'●)