今天写实验时遇到了Serializable,但对这个接口确实不甚了解,于是就去查看了jdk文档,顺便记录我对这个Serializable接口的理解。
首先我们在文档中看到java.io.Serializable这个接口有非常多的子接口:
AdapterActivator, Attribute, Attribute, Attributes, BindingIterator, ClientRequestInfo, ClientRequestInterceptor, Codec, CodecFactory, Control, Current, Current, Current, CustomValue, DataInputStream, DataOutputStream, Descriptor, DHPrivateKey, DHPublicKey, DocAttribute, DomainManager, DSAPrivateKey, DSAPublicKey, DynAny, DynAnyFactory, DynArray, DynEnum, DynFixed, DynSequence, DynStruct, DynUnion, DynValue, DynValueBox, DynValueCommon, ECPrivateKey, ECPublicKey, ExtendedRequest, ExtendedResponse, Externalizable, IdAssignmentPolicy, IDLEntity, IDLType, IdUniquenessPolicy, ImplicitActivationPolicy, Interceptor, IORInfo, IORInterceptor, IORInterceptor_3_0, IRObject, Key, LifespanPolicy, Name, NamingContext, NamingContextExt, NotificationFilter, ObjectReferenceFactory, ObjectReferenceTemplate, ORBInitializer, ORBInitInfo, PBEKey, POA, POAManager, Policy, PolicyFactory, PrintJobAttribute, PrintRequestAttribute, PrintServiceAttribute, PrivateKey, PublicKey, QueryExp, RelationType, RemoteRef, RequestInfo, RequestProcessingPolicy, RSAMultiPrimePrivateCrtKey, RSAPrivateCrtKey, RSAPrivateKey, RSAPublicKey, RunTime, SecretKey, ServantActivator, ServantLocator, ServantManager, ServantRetentionPolicy, ServerRef, ServerRequestInfo, ServerRequestInterceptor, StreamableValue, SupportedValuesAttribute, ThreadPolicy, UnsolicitedNotification, ValueBase, ValueExp
序列化
但是这个接口中一个成员函数或者成员变量都没有,那么这个接口到底有什么作用呢?
官方文档对其的定义是:类通过实现java.io.Serializable接口以启用其序列化功能。未实现此接口的类无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于表示可序列化的语义。
从上面的描述中,我们可以知道Serializable接口的作用就是实现序列化。
什么是序列化?
序列化就是把Java对象转化为字节序列的过程。与之相对应的反序列化就是把字节序列恢复为Java对象的过程。
序列化和反序列化有什么作用呢?
对象的寿命通常随着生成该对象的程序的终止而终止,有时候需要把在内存中的各种对象的状态(也就是实例变量,不是方法)保存下来,并且可以在需要时再将对象恢复。而Java就为我们提供了这样的机制,即序列化。
所以说,序列化最重要的作用就是在传递和保存对象时保证对象的完整性和可传递性。对象转换成为有序字节流,以便于在网络上传输或者保存到本地。
反序列化的最重要作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
总结:核心作用就是对象状态的保存和重建,Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里(系列化),并且可以从其它地方把该Byte 流里的数据读出来(反序列化)。
所以说,序列化的用途其实很明确:
- 当你想把内存中的对象状态保存到文件或者数据库中时,请使用序列化。
- 当你想把对象通过网络传播出去时,请使用序列化。
如何序列化呢?
类通过实现java.io.Serializable接口以启用其序列化功能。
官方文档很明确的告诉了我们只要一个类实现了Serializable接口,那么这个类就被序列化了。
class User implements Serializable{
private static final long serialVersionUID=1L;//稍后我们会说明这一行代码是做什么的。
String name;
int age;
public User(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "name"+name+"\tage:"+age;
}
}
通过ObjectOutputStream 的writeObject()方法可以把这个类的对象写到一个地方(文件),再通过ObjectInputStream 的readObject()方法把这个对象读出来。
File file = new File("file"+File.separator+"out.txt");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(fos);
User user = new User("tom", 22);
System.out.println(user);
oos.writeObjec