java readexternal_在Java中,序列化和Externalable有什么区别?

序列化提供了存储和稍后重新创建对象的默认功能。它使用详细的格式定义要存储的整个对象图,例如,假设您有一个linkedList,代码如下所示,那么默认的序列化将发现所有链接的对象并进行序列化。在默认序列化中,对象完全由其存储的位构成,没有构造函数调用。ObjectOutputStream oos = new ObjectOutputStream(

new FileOutputStream("/Users/Desktop/files/temp.txt"));

oos.writeObject(linkedListHead); //writing head of linked list

oos.close();

但是,如果您希望有限制的序列化,或者不希望您的对象的某些部分被序列化,那么请使用Externalable。Externalable接口扩展了可序列化的接口,并添加了两个方法:writeExoun()和readExoun()。它们在序列化或反序列化时自动调用。在使用Externalable时,我们应该记住默认构造器应该是公共的,否则代码会抛出异常。请遵循以下代码:public class MyExternalizable implements Externalizable{private String userName;private String passWord;private Integer roll;

public MyExternalizable(){}public MyExternalizable(String userName, String passWord, Integer roll){

this.userName = userName;

this.passWord = passWord;

this.roll = roll;}@Overridepublic void writeExternal(ObjectOutput oo) throws IOException {

oo.writeObject(userName);

oo.writeObject(roll);}@Overridepublic void readExternal(ObjectInput oi) throws IOException, ClassNotFoundException {

userName = (String)oi.readObject();

roll = (Integer)oi.readObject();}public String toString(){

StringBuilder b = new StringBuilder();

b.append("userName: ");

b.append(userName);

b.append("  passWord: ");

b.append(passWord);

b.append("  roll: ");

b.append(roll);

return b.toString();}public static void main(String[] args){

try

{

MyExternalizable m  = new MyExternalizable("nikki", "student001", 20);

System.out.println(m.toString());

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/Users/Desktop/files/temp1.txt"));

oos.writeObject(m);

oos.close();

System.out.println("***********************************************************************");

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("/Users/Desktop/files/temp1.txt"));

MyExternalizable mm = (MyExternalizable)ois.readObject();

mm.toString();

System.out.println(mm.toString());

}

catch (ClassNotFoundException ex)

{

Logger.getLogger(MyExternalizable.class.getName()).log(Level.SEVERE, null, ex);

}

catch(IOException ex)

{

Logger.getLogger(MyExternalizable.class.getName()).log(Level.SEVERE, null, ex);

}}}

在这里,如果您注释默认构造器,那么代码将抛出在异常下面:java.io.InvalidClassException: javaserialization.MyExternalizable;

javaserialization.MyExternalizable; no valid constructor.

我们可以观察到,由于密码是敏感的信息,所以我不使用写外部(ObjectOutput Oo)方法对其进行序列化,也不会在readExoun(ObjectInput Oi)中设置它的值。这是Externalable提供的灵活性。

上述代码的输出如下:userName: nikki  passWord: student001  roll: 20***********************************************************************userName:

nikki  passWord: null  roll: 20

我们可以观察到,因为我们没有设置密码的值,所以它是空的。

也可以通过将密码字段声明为瞬态来实现同样的目的。private transient String passWord;

希望能帮上忙。如果我犯了什么错,我道歉。谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值