java序列化java.io.ExternalizableITeye - 众发娱乐

java序列化java.io.ExternalizableITeye

2019年03月09日14时22分40秒 | 作者: 寄琴 | 标签: 序列化,序列,目标 | 浏览: 1311

这次咱们讲的是操控目标的序列化和反序列化


操控序列化就是有挑选的序列化目标,而不是把目标的所以内容都序列化,前篇咱们的比如中介绍了transit变量和类变量(static)不被序列化,现在咱们还有一种更为灵敏的操控目标序列化和反序列办法,能够在序列化进程中贮存其他非this目标包括的数据



咱们现在再来介绍一个接口 java.io.Externalizable 。当目标完成了这个接口时,就能够灵敏的操控它的序列化和反序列进程,这个接口承继了java.io.Serializable



Externalizable 接口界说了两个办法,
writeExternal办法在序列化时被调用,能够在该办法中操控序列化内容,
readExternal办法在反序列时被调用,能够在该办法中操控反序列的内容



好了,现在咱们改写上例的UserInfo

Java代码
import java.io.*; 
import java.util.*; 
 
//本程序通过完成Externalizable接口操控目标序列化和反序列 
public class UserInfo implements Externalizable { 
  public String userName; 
  public String userPass; 
  public int userAge; 
 
  public UserInfo(){ 
  } 
 
  public UserInfo(String username,String userpass,int userage){ 
  this.userName=username; 
  this.userPass=userpass; 
  this.userAge=userage; 
  } 
 
  //当序列化目标时,该办法主动调用 
  public void writeExternal(ObjectOutput out) throws IOException{ 
  System.out.println("现在履行序列化办法"); 
  //能够在序列化时写非本身的变量 
  Date d=new Date(); 
  out.writeObject(d); 
  //只序列化userName,userPass变量 
  out.writeObject(userName); 
  out.writeObject(userPass); 
  } 
 
  //当反序列化目标时,该办法主动调用 
  public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{ 
  System.out.println("现在履行反序列化办法"); 
  Date d=(Date)in.readObject(); 
  System.out.println(d); 
  this.userName=(String)in.readObject(); 
  this.userPass=(String)in.readObject(); 
  } 
 
  public String toString(){ 
  return "用户名: "+this.userName+";暗码:"+this.userPass+ 
  ";年纪:"+this.userAge; 
  } 



 
改写测验类

Java代码
import java.io.ObjectOutputStream; 
import java.io.ObjectInputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.util.Date; 
import java.lang.management.*; 
public class Test { 
 
  //序列化目标到文件 
  public static void serialize(String fileName){ 
  try 
  { 
  //创立一个目标输出流,讲目标输出到文件 
  ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName)); 
 
  UserInfo user=new UserInfo("renyanwei","888888",20); 
  out.writeObject(user);  //序列化一个会员目标 
 
  out.close(); 
  } 
  catch (Exception x) 
  { 
  System.out.println(x.toString()); 
  } 
 
  } 
  //从文件反序列化到目标 
  public static void deserialize(String fileName){ 
  try 
  { 
  //创立一个目标输入流,从文件读取目标 
  ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName)); 
 
  //读取UserInfo目标并调用它的toString()办法 
  UserInfo user=(UserInfo)(in.readObject()); 
  System.out.println(user.toString()); 
 
  in.close(); 
  } 
  catch (Exception x) 
  { 
  System.out.println(x.toString()); 
  } 
 
  } 
 
  public static void main(String[] args) { 
 
  serialize("D:\\test.txt"); 
  System.out.println("序列化结束"); 
 
  deserialize("D:\\test.txt"); 
  System.out.println("反序列化结束"); 
  } 
 



  履行成果

现在履行序列化办法
序列化结束
现在履行反序列化办法
Thu Oct 23 22:18:12 CST 2008
用户名: renyanwei;暗码:888888;年纪:0
反序列化结束

总结:
首要,咱们在序列化UserInfo目标的时分,因为这个类完成了Externalizable 接口,在writeExternal()办法里界说了哪些特点能够序列化,哪些不能够序列化,所以,目标在通过这儿就把规定能被序列化的序列化保存文件,不能序列化的不处理,然后在反序列的时分主动调用readExternal()办法,依据序列次序挨个读取进行反序列,并主动封装成目标回来,然后在测验类接纳,就完成了反序列
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章