Java I/O流操作(四)---对象的序列化
2013-03-23 16:49
411 查看
首先,把对象序列化必须实现Serializable接口,只有这样才能把对象持久化到硬盘获取其他地方.
对象序列化操作需要使用到ObjectOutputStream和ObjectInputStream两个对象
ObjectOutputStream(OutputStreamout)
创建一个ObjectOutputStream把对象往OutputStream输出流写入
publicstaticvoidobjetcSeri()throwsException
{
ObjectOutputStreamoos=newObjectOutputStream(
newFileOutputStream("person.object"));
//写入person对象
oos.writeObject(newPerson("johnny",21,"CHINA"));
oos.close();
}
对象序列化操作需要使用到ObjectOutputStream和ObjectInputStream两个对象
创建一个ObjectOutputStream把对象往OutputStream输出流写入
ObjectOutputStream也是字节输出流的子类:
java.lang.Object java.io.OutputStream java.io.ObjectOutputStream
ObjectInputStream是字节输入流的子类:
[code]java.lang.Object java.io.InputStream java.io.ObjectInputStream
ObjectOutputStream通过writeObject( Objectobj) ObjectInputStream通过 readObject() 通过一个简单的程序测试:
publicstaticvoidobjetcSeri()throwsException
{
ObjectOutputStreamoos=newObjectOutputStream(
newFileOutputStream("person.object"));
//写入person对象
oos.writeObject(newPerson("johnny",21,"CHINA"));
oos.close();
}
控制台出现如下错误:
Exceptioninthread"main"java.io.NotSerializableException:com.huaxia.day21.Personatjava.io.ObjectOutputStream.writeObject0(UnknownSource)atjava.io.ObjectOutputStream.writeObject(UnknownSource)atcom.huaxia.day21.ObjectSerializable.objetcSeri(ObjectSerializable.java:15)atcom.huaxia.day21.ObjectSerializable.main(ObjectSerializable.java:9)
说明Person这个类没有实现Serializable接口
更正错误后发现硬盘中多了一个person.obejct文件
其内容为一些我们看不懂的字符:
那么我们是否通过ObjectInputStream读取到文件的内容呢?
publicstaticvoidreadObject()throwsException{
ObjectInputStreamois=newObjectInputStream(newFileInputStream("person.object"));
Personperson=(Person)ois.readObject();
System.out.println(person);
}
控制台输出结果:name:johnnyage:21country:CHINA
我们来看一下Serializable接口的API
这意思是说:如果实现了序列化接口的类没有显示声明serialVersionUID变量,序列化运行时将计算一个默认的serialVersionUID的值为这个类基于类的变量方面的值
.我们强烈建议所有实现序列化接口的类都要显示的声明serialVersionUID变量,因为默认的serialVersionUID变量值对于类的修改是非常敏感的,因为他的值就是根据
类成员的签名而生成的而不是系统随机生成的,假设我们对类A进行序列化,在一般情况下我们可以反序列化得到类A的信息,如果我们一旦修改了类A,
那么我们再次反序列化就会出现java.io.InvalidClassException异常的,因为第一次编译类A的时候他的id是一个值,
你修改类A后在再次编译id的值已经变了.因此为了保证在不同的编译器serialVersionUID变量的值一致性,
所以建议把该变量定义成一个private的常量.
下面来模拟这种情况:现在我修改Person类:如下
重新反序列化一次:
publicstaticvoidreadObject()throwsException{ObjectInputStreamois=newObjectInputStream(newFileInputStream("person.object"));Personperson=(Person)ois.readObject();System.out.println(person);}
控制台打印店异常:Exceptioninthread"main"java.io.InvalidClassException:com.huaxia.day21.Person;localclassincompatible:
streamclassdescserialVersionUID=-379036032685453711,
localclassserialVersionUID=1208026685571330753
总结:对象持久化需要实现Serializable接口,并且声明serialVersionUID常量
转载请注明出处:/article/3711882.html
相关文章推荐
- Java I/O流操作(四)---对象的序列化
- Java I/O流操作(四)---对象的序列化
- Java的IO操作(三) - 对象的序列化、ObjectInputStream和ObjectOutputStream类
- Java对象序列化操作详解
- java 基础之 I/O流 其四 (对象流和序列化)
- Java的IO操作(三) - 对象的序列化、ObjectInputStream和ObjectOutputStream类
- Java基础之对象的序列化(持久化)操作对象ObjectInputStream/ObjectOutputStream
- java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例
- Java IO操作——对象序列化(Serializable接口、ObjectOutputStream、以及与Externalizable接口的用法和区别)
- Thinking in java 琐碎知识点之 I/O流 、对象序列化
- java对象序列化和反序列化操作记录
- java IO操作与字节流(五)对象序列化
- java 关于中文字的输出 输入 和文件操作(对象序列化)
- Java基础(15):IO流—掌握对象序列化和反序列化操作
- [java]:对象序列化非常简单能看懂的操作
- Java 对象序列化和操作文件 正则表达式
- Java IO 中对象的序列化操作
- Java基础——对象序列化+管道流+RandomAccessFile+操作基本数据类型的DataStream等
- 黑马程序员——Java基础——对象序列化、管道流、RandomAccessFile类、操作基本数据类型的流对象、字符编码
- java中序列化与反序列化对象的简单操作!