对象流
使用
DataInputStream
或者
DataOutputStream
可以读写对象数据,但是操作比较繁琐
SUN
提供了
ObjectInputStream/ObjectOutputStream
可以直接将
Object
写入或读出
针对
8
种简单类型及其包装类的操作方法,以及针对
String
类型的操作方法
1.readObject():Object
2.writeObject(Object):void
读写一个对象的前提是这个类型的对象是可以被序列化的;
NotSerializableException
对象序列化【简单来说就是将对象可以直接转换为二进制数据流】
/
对象的反序列化【可以将二进制数据流转换为对象】,这一般依靠JVM
实现,编程中只做声明对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点,其他程序一旦获取到这种二进制流,都可以将这种二进制流恢复成原来的
Java
对象
1、如何声明对象所属于的类可以进行序列化和反序列化Serializable/Externalizable接口
其中的接口没有任何定义,仅仅只起到了说明的作用,这种接口叫做标志接口或者旗标接口
2
、可以通过
ObjectInputStream
【
readObject():Object
】和
ObjectOutputStream
【
writeObject(Object):void
】提供的方法直接操作对象
3
、输出对象
User user
=
new
User
();
user
.
setId
(
100L
);
user
.
setUsername
(
"zhangsan"
);
user
.
setPassword
(
"123456"
);
ObjectOutputStream oos
=
new
ObjectOutputStream
(
new
FileOutputStream
(
"users.data"
));
oos
.
writeObject
(
user
);
oos
.
close
();
4
、读取对象
ObjectInputStream ois
=
new
ObjectInputStream
(
new
FileInputStream
(
"users.data"
));
Object
temp
=
ois
.
readObject
();
if
(
temp
!=
null
&&
temp
instanceof
User
) {
User user
=
(
User
)
temp
;
System
.
out
.
println
(
user
);
}
ois
.
close
();
编码细节
1
、需要通过对象流读写的对象必须实现了序列化接口,否则
java.io.NotSerializableException
class
User
implements
Serializable
2
、
Serializable
接口是标志接口,没有需要实现的方法,所有的序列化和反序列化操作由
VM
负责实现。Externalizable接口定义为
public interface Externalizable extends java.io.Serializable
,这个接口中包含两个方法需要实现writeExternal
自定义实现对象的序列化,
readExternal
自定义实现对象的反序列化。除非特殊需求一般不使用Externalizable
接口,因为没有必要自定义
3
、类型转换问题:
Object
temp
=
ois
.
readObject