初探Java Serializable
初探Java Serializable
汉堡OSC 发表于1年前
初探Java Serializable
  • 发表于 1年前
  • 阅读 12
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

Java序列化用于对象的持久化存储或网络传输。所有的支持序列化的类都要实现Serializable接口,在官方源码中,该接口是一个空接口,如图

image

这也说明了interface的作用。对于序列化的原理,目前猜想流程大概是:与ObjcetOutputStream有关,相关的流类对对象进行序列化之前先使用暴力反射检查该类是否实现了Serializable接口,然后将该对象的各个字段转成二进制输出到文件或者网络流中。还原:先根据类创建一个空白对象,然后把反序列化后的字段赋值给空白对象。

有一点注意,transient关键字修饰的字段不会被序列化,反序列化后会得到null值。

具体的细节可以参考java中Serializable接口的理解(别人写过的我就不写了。)

上一个简单的demo

package com.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


/**
 * @author EQ
 * 用于测试transient关键字
 */
public class Test {
	public static void main(String[] args) throws Exception {
		People p=new People(18, "tom", "huaian");
		writeObject(p);
		readObject();
		
	}
	public static void writeObject(People p) throws Exception{
		FileOutputStream fout=new FileOutputStream("d://obj.txt");
		ObjectOutputStream out=new ObjectOutputStream(fout);
		out.writeObject(p);
		fout.close();
	}
	public static void readObject() throws Exception{
		FileInputStream fin=new FileInputStream("d://obj.txt");
		ObjectInputStream in=new ObjectInputStream(fin);
		People p=(People) in.readObject();
		fin.close();
		System.out.println(p.name);
		System.out.println(p.getAge());
		System.out.println(p.getAddress());
		System.out.println(p.tag);
	}
}

class People implements Serializable{
	public static int tag=100;
	private int age;
	public String name;
	transient String address;
	public People(int a,String name,String add){
		this.age=a;
		this.name=name;
		this.address=add;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
}

 

 

如有错误,还请不吝指出。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 4
博文 20
码字总数 15838
×
汉堡OSC
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: