专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java序列化,你应该会的基本操作(java序列化有什么作用)

temp10 2024-10-08 18:06:04 java教程 12 ℃ 0 评论

Java提供了一种对象序列化的机制,指的就是将一个对象表示成一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中的数据类型信息。然后将其写入文件中或者数据库中以保存,如果需要使用它时,在通过反序列化的方式拿到它,其包换的信息依旧能够获得。

为什么我们需要序列化对象?

当需要将对象存入到网络中、文件中、数据库中的时候,就需要序列化对象。网络设备和存储设备只能理解位和字节,而不能理解对象,序列化将对象转化成字节就可以网络发送或者存入内存了。

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()返回读取的对象。

Tags:

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

欢迎 发表评论:

最近发表
标签列表