ObjectInputStream和ObjectOutputStream
package stream.object;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* 序列化流:
* 把对象按照流一样的方式;
* 反序列化流:
* 把文件中的对象读取出来;
*
* @author 半步疯子
*
* 序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输,对象 -- 流数据
* 反序列化流:把文本文件中的流对象数据或网络中的流对象还原成对象,流数据 -- 对象
*
*/
public class ObjectStreamDemo01 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 由于我们于要对对象进行序列化,所以我们要对
write();
read();
}
private static void read() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
// 虽然是Object接收的,但是本质上还是Person010101的对象
Object obj = ois.readObject();
ois.close();
// 在进行toString方法的时候,调用的还是Person010101中的toString方法
System.out.println(obj);
}
private static void write() throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
Person p1 = new Person("mzy", 19);
oos.writeObject(p1);
oos.close();
}
}
首先在使用ObjectInputStream和ObjectOutputStream的时候,放置在此IO中的对象,必须要实现Serializable接口!序列化接口(实现了此接口,代表我们的对象支持序列化)
但是实现了Serializable接口之后,其中并没有实现任何方法,对于这种接口,我们称之为标记接口。
class Person implements Serializable{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
}
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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
首先运行一遍程序,然后注释掉前面的write方法和后面的private修饰的age,单独进行从文件中读对象到程序中。
抛出异常:
java.io.InvalidClassException:
stream.object.Person;
local class incompatible: // incompatible 不相容的,互相矛盾的
stream classdesc serialVersionUID = 3743887113483319275,
local class serialVersionUID = 2519694131930475475
表明两个对象不相同,因为我们其中的变量的修饰信息都修改了,对应的已经不是同一个对象了
怎么解决?
这里就涉及到之间,在java Swing中多次遇到的问题:
黄色警告线:
The serializable class Person does not declare a static final serialVersionUID field of type long
这个警告是什么意思?
告诉我们此序列化类,并没有一个id标识。
每次修改.java文件的时候,.class中的id值都会改变
(上述的修改:必须为有效修改,修改具体的代码:空格、文本注释和换行虽然也修改了,但是具体的代码并没有改变)
而读取文件时,会和class文件进行匹配,如果id不同则会抛出上述的异常
如果我们添加上了id标记:此类对象就可以以流的形式存储,并且可以在网络上传输
如果我们加上了serialVersionUID 那么上面由于我们修改了类中的关键字的修饰符
所造成的错误,就不会发生了,只要序列号相同,那么就可以了。
class Person implements Serializable{
private static final long serialVersionUID = 1L;
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
}
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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
补充:用transient修饰说明这个成员变量我不想被序列化
private transient int age;
ObjectInputStream和ObjectOutputStream的更多相关文章
- serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法
ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Ser ...
- 使用ObjectInputStream和ObjectOutputStream注意问题
1.对象序列化,类实现Serializable接口 不需要序列化的属性,使用transient声明 2.使用套接字流在主机之间传递对象注意问题: 学习自:Socket同时使用ObjectInputSt ...
- Java-IO之对象输入流输出流(ObjectInputStream和ObjectOutputStream)
ObjectInputStream和ObjectOutputStream的作用是对基本数据和对象进行序列化操作支持.创建文件输出流对应的ObjectOutputStream对象,该ObjectOutp ...
- [九]JavaIO之ObjectInputStream 和 ObjectOutputStream
序列化 序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程 序列化是一种轻量级的持久化,对象都是存活在内存中的,当JVM运行结束,对象便不存在 ...
- java io系列05之 ObjectInputStream 和 ObjectOutputStream
本章,我们学习ObjectInputStream 和 ObjectOutputStream ObjectInputStream 和 ObjectOutputStream 介绍 ObjectInputS ...
- Java之IO(七)ObjectInputStream和ObjectOutputStream
转载请注明源出处:http://www.cnblogs.com/lighten/p/7003536.html 1.前言 本章介绍Java字节流中重要的成员,对象流ObjectInputStream和O ...
- ObjectInputStream与ObjectOutputStream类实现对象的存取
1. ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 ...
- IO操作之ObjectInputStream与ObjectOutputStream
之前写过DataInputStream和DataOutputStream,使用这两个类可以对java基本数据类型进行序列化和反序列化. 本篇再来两个新东西:ObjectInputStream,Obje ...
- Java IO: 序列化与ObjectInputStream、ObjectOutputStream
作者:Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和O ...
- Java IO(六) ObjectInputStream 和 ObjectOutputStream
Java IO(六) ObjectInputStream 和 ObjectOutputStream 一.介绍 对于对象数据的处理,Java IO 提供了 ObjectInputStream 和 Obj ...
随机推荐
- Java安全之XStream 漏洞分析
Java安全之XStream 漏洞分析 0x00 前言 好久没写漏洞分析文章了,最近感觉在审代码的时候,XStream 组件出现的频率比较高,借此来学习一波XStream的漏洞分析. 0x01 XSt ...
- Abp太重了?轻量化Abp框架
本文首发于个人博客(https://blog.zhangchi.fun/) 在进行框架的选型时,经常会听到"***框架太重了"之类的声音,比如"Abp太重了,不适合我们. ...
- React 组件间通信 总结
组件间通信 5.1.1. 方式一: 通过props传递 1) 共同的数据放在父组件上, 特有的数据放在自己组件内部(state) 2) 通过props可以传递一般数据和 ...
- springMVC-12-整合spring和springmvc
问题1: 好像我们只需要使用springmvc的配置文件作为IOC容器就可以了 --> 需要进行Spring 整合SpringMVC吗? ----> 还是否需要再加入Spring的IOC容 ...
- 第五十三篇 -- MFC美化界面2
IDC_STATIC 1. 设置字体样式 方法1:在OnInitDialog()函数中使用以下语句 CFont * f; f = new CFont; f->CreateFont(50, // ...
- 第八篇 -- 用U盘制作启动盘装Win10系统
下载装机吧:http://www.zhuangjiba.com 装Win10参考文章:http://www.zhuangjiba.com/bios/13249.html U盘启动盘制作 1.首先将U盘 ...
- 深入刨析tomcat 之---第7篇 这个是链接,如果使用idea 创建servlet工程
recoded by 张艳涛 使用IDEA创建Servlet项目 使用IDEA创建Servlet项目
- 论文笔记:(NIPS2017)PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
目录 一. 存在的问题 1.提取局部特征的能力 2.点云密度不均问题 二.解决方案 1.改进特征提取方法: (1)采样层(sampling) (2)分组层(grouping) (3)特征提取层(fea ...
- Python小白的数学建模课-16.最短路径算法
最短路径问题是图论研究中的经典算法问题,用于计算图中一个顶点到另一个顶点的最短路径. 在图论中,最短路径长度与最短路径距离却是不同的概念和问题,经常会被混淆. 求最短路径长度的常用算法是 Dijkst ...
- 在Java开发工具的project中使用相对路径
1.在project中,相对路径的根目录是project的根文件夹,在此就是repathtest文件夹了.创建文件的写法是: File f = new File("src/com/lavas ...