Java序列化与static

1 篇文章 0 订阅
1 篇文章 0 订阅

简介:

Java序列化,就是指将一个对象转化为二进制的byte流(注意,不是bit流),然后以文件的方式进行保存。

序列化操作:将对象保存至文件;

反序列化操作:从文件恢复出对象;


配置:

对象如果要序列化,则必须集成Serializable接口;

在实现序列化时,用ObjectOutputStream实现;

而反序列化时,用ObjectInputStream实现;


方法:

1. 序列化:

(1) public ObjectOutputStream(OutputStream out) throws IOException

(2) public final void writeObject(Object obj)

(3) public void close() throws IOException


2.反序列化:

(1) public ObjectInputStream(InputStream in) throws IOException

(2) public final void readObject(Object obj)

(3) public void close() throws IOException


注意:

Java序列化是不能序列化static变量的,因为其保存的是对象的状态,而static变量保存在全局数据区,在对象未实例化时就已经生成,属于类的状态。

为了方便理解,我们举例说明:


例子:

首先附上我们要序列化的对象的生成类:

package test;

import java.io.Serializable;

public class Person implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String name;
	private int age;
	
	public static String test="IBM";
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
这里我们有static变量test,赋值为IBM。


下面我们来看两个代码:

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

public class Main{
	
	public static void main(String[] args){
		
		Person person = new Person();
		person.setAge(25);
		person.setName("YXY");
		Person.test="JAVA"; //modify the test value
		
		File file = new File("c:/test.txt");
		try {
			OutputStream out = new FileOutputStream(file);
			ObjectOutputStream objout = new ObjectOutputStream(out);
			objout.writeObject(person);
			objout.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//code segment 1
		Person perobj = null;
		try {
			InputStream in = new FileInputStream(file);
			ObjectInputStream objin = new ObjectInputStream(in);
			perobj = (Person)objin.readObject();
			System.out.println(perobj.test);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}
在这段代码里,一开始我们就改了static变量test的值为JAVA,然后在code segment 1上面我们首先实现了序列化,接着我们在code segment 1下面实现了反序列化,读取对象,运行,我们发现结果是JAVA,这时大家要问了,说不序列化static变量,怎么读取出来的反序列化对象的值,test的值还改变呢?这正是因为我们并没有序列化static变量,所以它并没有被写入流中,所以当我们要读取test的值时,它不可能在反序列化的文件里找到新的值,而是去全局数据区取值,因为全局数据区的值现在是JAVA,所以读取出来的值就是改变后的值JAVA了。


下面我们再看一段代码:

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;

public class TEST {
	public static void main(String[] args){
		File file = new File("c:/test.txt");
		
		//code segment 1
		Person perobj = null;
		try {
			InputStream in = new FileInputStream(file);
			ObjectInputStream objin = new ObjectInputStream(in);
			perobj = (Person)objin.readObject();
			System.out.println(perobj.test);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}
同样也是反序列化操作,只不过放到了另一个文件里,这时再运行,结果就是IBM,不再是之前的JAVA,正是因为我们并没有序列化static变量,所以test的值并不会改变,因为运行这个文件时,全局数据区里的static变量也没有改,所以它一如既往的是它的原始值IBM。


总结,综上所述,Java序列化是不能序列化static变量的,大家在使用的时候一定不要混淆。



  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java序列化是将Java对象转换为字节序列的过程,以便将其存储在文件中或通过网络传输。反序列化则是将字节序列转换回Java对象的过程。 Java提供了两种序列化机制:Java序列化和外部化(Externalization)序列化。其中Java序列化是自动进行的,而外部化序列化需要手动实现。 Java序列化的实现方式是通过将Java对象转换为字节流,然后将字节流写入文件或通过网络发送。反序列化则是从字节流中读取数据并将其还原为Java对象。 序列化和反序列化的步骤如下: 序列化: 1.创建一个对象输出流(ObjectOutputStream)。 2.调用对象输出流的writeObject()方法将Java对象转换为字节流并写入文件或网络。 反序列化: 1.创建一个对象输入流(ObjectInputStream)。 2.从输入流中读取字节流并调用readObject()方法将其转换为Java对象。 需要注意的是,被序列化的对象必须实现Serializable接口,该接口没有任何方法,只是标识该类可以被序列化。 以下是一个Java序列化和反序列化的示例代码: ``` import java.io.*; public class SerializationDemo { public static void main(String[] args) { // 序列化对象 try { // 创建一个Student对象 Student s = new Student("张三", 18, "男"); // 创建一个对象输出流 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student.ser")); // 将Student对象写入输出流中 oos.writeObject(s); // 关闭输出流 oos.close(); } catch (IOException e) { e.printStackTrace(); } // 反序列化对象 try { // 创建一个对象输入流 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("student.ser")); // 从输入流中读取Student对象 Student s = (Student) ois.readObject(); // 输出Student对象的属性 System.out.println(s.getName()); System.out.println(s.getAge()); System.out.println(s.getGender()); // 关闭输入流 ois.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } } // Student类需要实现Serializable接口 class Student implements Serializable { private String name; private int age; private String gender; public Student(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public int getAge() { return age; } public String getGender() { return gender; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值