Java 序列化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java 序列化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3606字,纯文字阅读大概需要6分钟。
内容图文
java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
简单来说,序列化就是将对象转化为字节流,反序列化就是将字节流转化为对象。
writeObject与readObject
要让一个类支持序列化,只需要让这个类实现接口java.io.Serializable。Serializable没有定义任何方法,只是一个标记接口。
声明实现了Serializable接口后,保存/读取Student对象就可以使用ObjectOutputStream/ObjectInputStream流了。
ObjectOutputStream是OutputStream的子类,但实现了ObjectOutput接口。ObjectOutput是DataOutput的子接口,增加了一个方法:
public void writeObject(Object obj) throws IOException
这个方法能够将对象obj转化为字节,写到流中。
ObjectInputStream是InputStream的子类,它实现了ObjectInput接口。ObjectInput是DataInput的子接口,增加了一个方法:
public Object readObject() throws ClassNotFoundException, IOException
这个方法能够从流中读取字节,转化为一个对象。
Employee.java 文件代码:
public class Employee implements java.io.Serializable{ public String name; public String address; public transient int SSN; public int number; public void mailCheck(){ System.out.println("Mailing a check to " + name + " " + address); } }
序列化对象
ObjectOutputStream 类用来序列化一个对象,如下的 SerializeDemo 例子实例化了一个 Employee 对象,并将该对象序列化到一个文件中。
该程序执行后,就创建了一个名为 employee.ser 文件。该程序没有任何输出,但是你可以通过代码研读来理解程序的作用。
注意: 当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名。
public class SerializeDemo { public static void main(String[] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in employee.ser"); } catch (IOException i) { i.printStackTrace(); } } }
反序列化对象
下面的 DeserializeDemo 程序实例了反序列化,/employee.ser 存储了 Employee 对象。
public class DeserializeDemo { public static void main(String[] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); } catch (IOException i) { i.printStackTrace(); return; } catch (ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); } }
以上程序编译运行结果如下所示:
DeserializedEmployee...
Name:ReyanAli
Address:PhokkaKuan,AmbehtaPeer SSN:0
Number:101
这里要注意以下要点:
readObject() 方法中的 try/catch代码块尝试捕获 ClassNotFoundException 异常。对于 JVM 可以反序列化对象,它必须是能够找到字节码的类。如果JVM在反序列化对象的过程中找不到该类,则抛出一个 ClassNotFoundException 异常。
注意,readObject() 方法的返回值被转化成 Employee 引用。
当对象被序列化时,属性 SSN 的值为 111222333,但是因为该属性是短暂的,该值没有被发送到输出流。所以反序列化后 Employee 对象的 SSN 属性为 0。
参考:java编程的逻辑 14.1
来源:java序列化-https://www.runoob.com/java/java-serialization.html
内容总结
以上是互联网集市为您收集整理的Java 序列化全部内容,希望文章能够帮你解决Java 序列化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。