对象序列化就是把对象变成二进制的数据流的一种方法。通过对象的序列化可以把对象方便的存储和操作
如果一个类想要被序列化,就必须实例化Serializable接口
如果想要对对象进行传输,还需要用到ObjectOutputStream类和ObjectInputStream
1。 序列化和反序列化
把对象通过ObjectOutputStream流输出,叫序列化,而ObjectInputStream这个叫反序列化
在程序运行的过程中,如果序列化的JDK版本和反序列化的JDK版本不统一,就容易造成异常,所以需要加一个标示,这个表示就是一个常量:SerialVersionUID,可以通过它来验证的版本的是否统一
补充:
什么是Java对象序列化
Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。
使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。
除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列化提供了一个标准机制,该API简单易用
2.对象输出流
我们来做个例子
class
Man
implements
Serializable{
private
static
final
long
serialVersionUID
= 1583839984071561365L;
private
String
name
;
private
int
age
;
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;
}
public
Man(String name,
int
age) {
super
();
this
.
name
= name;
this
.
age
= age;
}
@Override
public
String toString() {
return
"姓名"
+
this
.
name
+
"年龄"
+
this
.
age
;
}
}
public
class
SerDemo {
public
static
void
main(String[] args)
throws
Exception {
Man p=
new
Man(
"like"
,30);
ObjectOutputStream oop=
new
ObjectOutputStream(
new
FileOutputStream(
new
File(
"f:"
+File.
separator
+
"a.txt"
)));
oop.writeObject(p);
oop.close();
}
}
打开a.txtx,你会看到全是乱码,这是因为存储的是二进制数据。。。
序列化只序列化了对象的属性
3.反序列化
public
class
SerDemo1 {
public
static
void
main(String[] args)
throws
Exception {
File f=
new
File(
"f:"
+File.
separator
+
"a.txt"
);
ObjectInputStream ois=
new
ObjectInputStream(
new
FileInputStream(f));
Object obj=ois. readObject();
ois.close();
System.
out
.println(obj);
}
}
结果:
姓名like年龄30
补充:如果在序列化的时候,某个属性不想被序列化,可以使用transient关键字声明
例如:
private transient String name;
那么这个属性就不会被序列化