java 序列化接口_java.io.Serializable 序列化接口

本文介绍了Java序列化的基本概念,包括序列化与反序列化的定义及应用场景。文章指出,通过实现Serializable接口可以使Java对象转化为字节流以便存储或传输。文章还讨论了序列化过程中对象的关系,强调反序列化后的对象是深复制,并举例说明了如何使用transient关键字阻止某些变量被序列化。此外,还提供了序列化和反序列化的示例代码,总结了序列化的相关要点,如父类序列化则子类自动序列化,静态和transient变量不参与序列化等。
摘要由CSDN通过智能技术生成

什么是序列化、反序列化?

Serialization(序列化)是一种将对象以一连串的字节描述的过程;

反序列化deserialization是一种将这些字节重建成一个对象的过程。

序列化通俗一点说就是能将Java对象转化成文本文件的一种方式。

什么情况下需要序列化 ?

a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;

b)当你想用套接字在网络上传送对象的时候;

c)当你想通过RMI传输对象的时候;

如何实现序列化 ?

将需要序列化的类实现Serializable接口就可以了。

public class ArrayList implements java.io.Serializable{

}

ArrayList 这个类就实现了序列化,当然实现它的类很多,此处只举个例子。

jdk源码如下:

public interface Serializable {

}

是的,啥也没有,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。

所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得所有问题。

序列化前和序列化后的对象的关系

是 "=="还是equal? or 是浅复制还是深复制?

答案:深复制,反序列化还原后的对象地址与原来的的地址不同

序列化前后对象的地址不同了,但是内容是一样的,而且对象中包含的引用也相同。换句话说,通过序列化操作,我们可以实现对任何可Serializable对象的”深度复制(deep copy)"——这意味着我们复制的是整个对象网,而不仅仅是基本对象及其引用。对于同一流的对象,他们的地址是相同,说明他们是同一个对象,但是与其他流的对象地址却不相同。也就说,只要将对象序列化到单一流中,就可以恢复出与我们写出时一样的对象网,而且只要在同一流中,对象都是同一个。

transient

它的作用简单一句话,就是屏蔽该关键字修饰变量的序列化。

如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。

Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。

packageperson.peng;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.Serializable;public class MyTest implementsSerializable

{private static final long serialVersionUID = 1L;private String name="pengxuxiangfei";private int age=22;public static voidmain(String[] args)

{//以下代码实现序列化

try{

ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("my.out"));//输出流保存的文件名为 my.out ;ObjectOutputStream能把Object输出成Byte流

MyTest myTest=newMyTest();

oos.writeObject(myTest);

oos.flush();//缓冲流

oos.close(); //关闭流

} catch(FileNotFoundException e)

{

e.printStackTrace();

}catch(IOException e)

{

e.printStackTrace();

}

fan();//调用下面的 反序列化 代码

}public static void fan()//反序列的过程

{

ObjectInputStream oin= null;//局部变量必须要初始化

try{

oin= new ObjectInputStream(new FileInputStream("my.out"));

}catch(FileNotFoundException e1)

{

e1.printStackTrace();

}catch(IOException e1)

{

e1.printStackTrace();

}

MyTest mts= null;try{

mts= (MyTest ) oin.readObject();//由Object对象向下转型为MyTest对象

} catch(ClassNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

System.out.println("name="+mts.name);

System.out.println("age="+mts.age);

}

}

总结:

a)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;

b)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;

c) static,transient后的变量不能被序列化;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值