java 序列化与反序列(完整)

提纲:

1:序列化的概念与作用

2:序列化的分类 : 普通序列化 和 扩展序列化(实例

3:序列化成为XML文件,并反序列化实例

具体类容:

1:序列化的概念与作用

概念:序列化是将heap中的对象的状态存储起来,以便后期可以使用序列化的类容进行反序列化

作用:利于在网络中传输对象

2:普通序列化是指 : 那些实现了Serializable 接口的类,它是最基础的序列化只能对一个对象进行完全序列化。

扩展序列化是指 :如果你只希望序列化一个类中的一部分或者序列化其他要加入的类那么你就必须要了解扩展序列化了。扩展序列化 Externalizable接口是Serializable 接口的子类

2.1 : 普通序列化的实例

需要被序列化的类我们不妨叫做User ,该类很简单就是实现了Serializable接口。有两个成员属性:username ,password(代码一)

package Serize; import java.io.Serializable; public class User implements Serializable { public String username =""; public String password="" ; public User(String username , String password) { this.username = username ; this.password = password ; } }

序列化与反序列化类:分别用save()和write()来模拟(代码二)

package Serize; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; /* * 普通的序列化 */ public class MySerialize { private static final long serialVersionUID = 1L; public User user ; public MySerialize() { user = new User("pdw" , "123456"); } public static void main(String[] args) { MySerialize ser = new MySerialize() ; ser.save(); ser.read(); } public void save() { try { OutputStream outp =new FileOutputStream("d://1.txt"); // 通过文件的形式保存了对象 ObjectOutputStream out = new ObjectOutputStream(outp); out.writeObject(user); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void read() { InputStream in; try { in = new FileInputStream("d://1.txt"); ObjectInputStream out = new ObjectInputStream(in); User user = (User) out.readObject();// 通过文件的形式重构了对象 System.out.println(user.username + " " + user.password); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }

  2.2 扩展序列化 需要被序列化的类(代码三)

package Serize; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Date; public class ExtUser implements Externalizable { public String username =""; public String password =""; public ExtUser(String username , String password) { this.username = username; this.password = password; } public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException { //按照相应类型转换 Date date =(Date) in.readObject(); System.out.println( date.toString()); String name = (String) in.readObject(); System.out.println(name); } public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(new Date()); //写其他类也是允许的 out.writeObject(username); //写类的一部分也是允许的 } } /* * 输出结果 : * Fri Jun 10 13:49:25 CST 2011 * pdw * */

实现序列化的类(代码四)

package Serize; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class ExtSerializer { public static void main(String[] args) { // 读序列化文件 ExtUser user = new ExtUser("pdw" , "123"); FileInputStream in ; try { in = new FileInputStream("D://ext.txt"); ObjectInputStream obj2 = new ObjectInputStream(in); user.readExternal(obj2); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } //写序列化文件 FileOutputStream out; try { out = new FileOutputStream("D://ext.txt"); ObjectOutputStream obj = new ObjectOutputStream(out) ; user.writeExternal(obj); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

3:序列化成XML 文件(普通的和扩展的都可以实例化成XML文件的)

被扩展的类使用了代码一

实例化类

package Serize; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class XMLSerialize { XStream xstream ; public static void main(String[] args) { XMLSerialize ser = new XMLSerialize() ; ser.xmlWrite(); ser.xmlRead(); } public void xmlWrite() { xstream = new XStream(); User[]user = new User[2]; user[0] =new User("pdw","123456"); user[1] = new User("root", "123456"); OutputStream out; try { out = new FileOutputStream("d://2.xml"); xstream.toXML(user, out); xstream = null; out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void xmlRead(){ xstream = new XStream(new DomDriver()); //按照Dom 进行解析XML try { FileInputStream in = new FileInputStream("d://2.xml") ; User user[] = (User[]) xstream.fromXML(in) ; for (int i = 0; i < user.length; i++) { System.out.println(user[i].username); System.out.println(user[i].password); } xstream = null; } catch (FileNotFoundException e) { e.printStackTrace(); } } }

值得注意的是: 序列化成为XML是需要下载外部包的:具体的下载地址:http://xstream.codehaus.org/download.html

我的使用的是 :xstream-1.3.1.jar

使用方法是在EC中导入外不包 bulid Path

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值