博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JavaSE】day10_对象流
阅读量:4305 次
发布时间:2019-05-27

本文共 4589 字,大约阅读时间需要 15 分钟。

【JavaSE】day10_对象流

对象是存在于内存中的。有时候我们需要将对象保存到硬盘上,又有时我们需要将对象传输到另一台计算机上等等这样的操作。这时我们需要将对象转换为一个字节序列,而这个过程就称为对象序列化。相反,我们有这样一个字节序列需要将其转换为对应的对象,这个过程就称为对象的反序列化。

1.OOS

1)java.io.ObjectOutputStream

 * 该高级流的作用是将给定的java中的对象转换为一组字节,然后通过其处理的流写出。

 * 将一个对象转换为一组字节的过程称为:对象序列化。

2)ObjectOutputStream提供了一个独有的方法

         * void writeObject(Object o)

    该方法会将给定的对象o转换为一组字节,然后再通过其处理的流写出。

代码示例:

Person.java

package day03;import java.io.Serializable;import java.util.List;/** * 该类用于测试对象序列化 *  * 若当前类的对象希望被ObjectputStream进行序列化, * 当前类必须实现java.io.Serializable接口。 * 否则在序列化过程中会抛异常。 * 该接口没有任何抽象方法需要重写,这种接口的目的是 * 给子类打上一个标签,表示其认可这件事。而不是用来 * 约束子类应该具有哪些行为。 * * 除了当前类之外,该类的属性若也是自定义类型的, * 那么该类也必须实现Serializable接口才可以。 */public class Person implements Serializable {	/**	 * 当我们的类实现了Serializable接口后,就应当定义	 * 下面的常量,该常量是版本号,最好自行维护,该版本	 * 号直接影响反序列化的结果。	 * 当我们要反序列一个对象时,OIS首先会检查要反序列	 * 化的那一组字节表示的对象的版本号是否与当前类的版本	 * 号一致,不一致则直接抛异常,告知版本不匹配,无法反序列化。	 * 若版本号一致,则会使用兼容默认,即:	 * 若原来对象中有的属性,现在类中还有的,则还原它的值;	 * 若原来对象中有的属性,现在类中没有了,则忽略;	 * 若原来对象中没有的属性,现在类中有的,则使用默认值。	 * 	 * 若不自行维护版本号,那么OOS在进行序列化时,会根据当前	 * 类的结构生成一个版本号,这样做不好的地方在于:我们的类	 * 结构发生改变后,版本号也会改变,由于不可控,所以不能启用	 * 兼容模式。	 */	private static final long serialVersionUID = 2L;	private String name;	private int age;	private String gender;	private int salary;		/*	 * 当一个属性被transient关键字修饰后,该属性在序列化	 * 的时候被忽略。忽略不必要的属性是为了对象在序列化为	 * 字节的时候搜身。	 */	private transient List
otherInfo; //private A a; //public void setA(A a){ // this.a = a; //} public Person() { super(); } public Person(String name, int age, String gender, int salary, List
otherInfo) { super(); this.name = name; this.age = age; this.gender = gender; this.salary = salary; this.otherInfo = otherInfo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } public List
getOtherInfo() { return otherInfo; } public void setOtherInfo(List
otherInfo) { this.otherInfo = otherInfo; } public String toString(){ return name+","+age+","+gender+","+salary+","+otherInfo; } }

OOSDemo.java

package day03;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.util.ArrayList;import java.util.List;/** * java.io.ObjectOutputStream * 该高级流的作用是将给定的java中的对象转换为 * 一组字节,然后通过其处理的流写出。 * 将一个对象转换为一组字节的过程称为:对象序列化。 * */public class OOSDemo {	public static void main(String[] args) throws IOException {		Person p = new Person();		p.setName("苍老师");		p.setAge(24);		p.setGender("女");		p.setSalary(1000000);				List
otherInfo = new ArrayList
(); otherInfo.add("写大字"); otherInfo.add("是个演员"); otherInfo.add("是个歌手"); otherInfo.add("促进中日文化交流"); p.setOtherInfo(otherInfo); //A a = new A(); //p.setA(a); /* * 将该对象转换成一组字节然后写入文件 * 这里需要两个流的组合来实现: * 1:ObjectOutputStream * 目的:可以将一个对象转换为一组字节 * 2:FileOutputStream * 目的:可以将一组字节写入文件 */ FileOutputStream fos = new FileOutputStream("person.obj"); ObjectOutputStream oos = new ObjectOutputStream(fos); /* * ObjectOutputStream提供了一个独有的方法 * void writeObject(Object o) * 该方法会将给定的对象o转换为一组字节,然后再 * 通过其处理的流写出。 */ oos.writeObject(p); System.out.println("序列化完毕!"); oos.close(); }}

2.OIS

1)java.io.ObjectInputStream

 * 该类的作用是读取一组字节(必须是由OOS将对象序列化后的一组字节),将其还原为对象。

2)Object readObject()

   * ObjectInputStream提供了一个方法,该方法可以从其处理的流中将字节读取回来并转换为对象返回。只不过返回的时候以顶级父类Object形式。所以返回后需要自己造型。

   * 该方法要求我们处理一个异常: ClassNotFoundException.

该异常通常出现的原因是,读取的那一组字节并不能转换为对象。这组字节不是由OOS的writreObject序列化的字节。

代码示例:

package day03;import java.io.FileInputStream;import java.io.IOException;import java.io.ObjectInputStream;/** * java.io.ObjectInputStream * 该类的作用是读取一组字节(必须是由OOS将对象序列化后的 * 一组字节),将其还原为对象。 *  */public class OISDemo {	public static void main(String[] args) throws IOException, ClassNotFoundException {		/*		 * 读取person.obj文件,将Person对象还原。		 * 从字节到对象的过程称为对象的"反序列化"。		 */		FileInputStream fis = new FileInputStream("person.obj");				ObjectInputStream ois = new ObjectInputStream(fis);				/*		 * Object readObject()		 * ObjectInputStream提供了一个方法,该方法可以		 * 从其处理的流中将字节读取回来并转换为对象返回。只		 * 不过返回的时候以顶级父类Object形式。所以返回后		 * 需要自己造型。		 * 		 * 该方法要求我们处理一个异常:		 * ClassNotFoundException.该异常通常出现的原因		 * 是,读取的那一组字节并不能转换为对象。		 * 这组字节不是由OOS的writreObject序列化的字节。 		 */		Person p = (Person)ois.readObject();		System.out.println(p);				ois.close();			}}

转载地址:http://mrews.baihongyu.com/

你可能感兴趣的文章
iOS开发的一些奇巧淫技
查看>>
常浏览的博客和网站
查看>>
Xcode 工程文件打开不出来, cannot be opened because the project file cannot be parsed.
查看>>
iOS在Xcode6中怎么创建OC category文件
查看>>
5、JavaWeb学习之基础篇—标签(自定义&JSTL)
查看>>
8、JavaWEB学习之基础篇—文件上传&下载
查看>>
reRender属性的使用
查看>>
href="javascript:void(0)"
查看>>
h:panelGrid、h:panelGroup标签学习
查看>>
f:facet标签 的用法
查看>>
<h:panelgroup>相当于span元素
查看>>
java中append()的方法
查看>>
必学高级SQL语句
查看>>
经典SQL语句大全
查看>>
log日志记录是什么
查看>>
<rich:modelPanel>标签的使用
查看>>
<h:commandLink>和<h:inputLink>的区别
查看>>
<a4j:keeyAlive>的英文介绍
查看>>
关于list对象的转化问题
查看>>
VOPO对象介绍
查看>>