Java之序列化

<span style="color:#ff0000;"><strong>    什么是序列化(Serializable):</strong></span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。
</span><pre name="code" id="best-answer-content" class="reply-text mb10" style="margin-top:0px; margin-bottom:10px; padding:0px; white-space:pre-wrap; word-wrap:break-word; zoom:1; line-height:22px; font-size:14px; background-color:rgb(255,252,246)">我们可以看到,该接口是空的。任何实现该接口的类(或接口继承自该接口)表明该类(或接口)是可序列化的。
<span style="font-family:'Comic Sans MS';">
</span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span><strong><span style="color:#ff0000;">为什么要序列化:</span></strong></span>
<span style="font-family:Comic Sans MS;"><span style="font-size:14px;">    </span></span><pre name="code" class="replyask-text" id="content-24288759" style="font-size:14px; margin-top:0px; margin-bottom:0px; padding:0px; white-space:pre-wrap; word-wrap:break-word; zoom:1; line-height:24px; background-color:rgb(255,252,246)"><span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>a)当你想把的内存中的对象写入到硬盘的时候;
<span style="white-space:pre">	</span>b)当你想用套接字在网络上传送对象的时候;
<span style="white-space:pre">	</span>c)当你想通过RMI传输对象的时候;
<span style="white-space:pre">	</span>再稍微解释一下</span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
<span style="white-space:pre">	</span>b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
<span style="white-space:pre">	</span>c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。</span>
<span style="font-family:Comic Sans MS;">
</span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>下面给出一个具体的例子(用到ObjectInputStream,ObjectOutputStream):</span>
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;

class User implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private String name;
	private String password;
	private transient String info;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getInfo() {
		return info;
	}

	public void setInfo(String info) {
		this.info = info;
	}

}

public class Test {

	public static void main(String[] args) throws Exception {
		
		User user = new User();
		user.setName("Benson");
		user.setPassword("123456");
		user.setInfo("student");
		
		File file = new File("user.dat");//该文件在项目根目录中可以查看
		OutputStream file_out = new FileOutputStream(file);
		ObjectOutputStream os = new ObjectOutputStream(file_out);
		
		os.writeObject(user);	//将对象写到user.dat文件中
		
		os.close();
		
		InputStream file_int = new FileInputStream(file);
		ObjectInputStream is = new ObjectInputStream(file_int);
		
		User my_user = (User)is.readObject();	//得到对象
		
		is.close();
		
		/*
		 * 输出信息
		 */
		System.out.println(my_user.getName());
		System.out.println(my_user.getPassword());
		System.out.println(my_user.getInfo()); //info为null,因为该字段被声明为瞬时的(transient)
	}
}

<pre name="code" class="replyask-text" id="content-24288759" style="font-size:14px; margin-top:0px; margin-bottom:0px; padding:0px; white-space:pre-wrap; word-wrap:break-word; zoom:1; line-height:24px; background-color:rgb(255,252,246)">运行结果为:
 
Benson
123456
null

<pre name="code" class="replyask-text" id="content-24288759" style="font-size:14px; margin-top:0px; margin-bottom:0px; padding:0px; white-space:pre-wrap; word-wrap:break-word; zoom:1; line-height:24px; background-color:rgb(255,252,246)"><span style="white-space:pre">	</span>该例子中编写了一个User pojo类,含有字段name,password和info。其中info被声明为transient。
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>该User类实现了Serializable接口,并且提供了一个序列版本号(可不写)</span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>之后创建了一个File对象,确定文件名。</span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>然后用ObjectOutputStream层层包装,将User类的一个实例写进该文件中。</span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>最后用ObjectInputStream取出该对象,并打印。</span>
<span style="font-family:Comic Sans MS;">
</span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>如果User类并没有被序列化,运行该程序会报错:</span>
 
Exception in thread "main" java.io.NotSerializableException: User
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at Test.main(Test.java:57)

<pre name="code" class="replyask-text" id="content-24288759" style="font-size:14px; margin-top:0px; margin-bottom:0px; padding:0px; white-space:pre-wrap; word-wrap:break-word; zoom:1; line-height:24px; background-color:rgb(255,252,246)">误原因是因为User类没有被序列化。
<span style="font-family:Comic Sans MS;">
</span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>另外如果不希望存储对象的字段被保存,可以声明该字段为transient(瞬时的)</span>
 


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值