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的更多相关文章

  1. serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法

    ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Ser ...

  2. 使用ObjectInputStream和ObjectOutputStream注意问题

    1.对象序列化,类实现Serializable接口 不需要序列化的属性,使用transient声明 2.使用套接字流在主机之间传递对象注意问题: 学习自:Socket同时使用ObjectInputSt ...

  3. Java-IO之对象输入流输出流(ObjectInputStream和ObjectOutputStream)

    ObjectInputStream和ObjectOutputStream的作用是对基本数据和对象进行序列化操作支持.创建文件输出流对应的ObjectOutputStream对象,该ObjectOutp ...

  4. [九]JavaIO之ObjectInputStream 和 ObjectOutputStream

    序列化 序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程 序列化是一种轻量级的持久化,对象都是存活在内存中的,当JVM运行结束,对象便不存在 ...

  5. java io系列05之 ObjectInputStream 和 ObjectOutputStream

    本章,我们学习ObjectInputStream 和 ObjectOutputStream ObjectInputStream 和 ObjectOutputStream 介绍 ObjectInputS ...

  6. Java之IO(七)ObjectInputStream和ObjectOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7003536.html 1.前言 本章介绍Java字节流中重要的成员,对象流ObjectInputStream和O ...

  7. ObjectInputStream与ObjectOutputStream类实现对象的存取

    1. ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 ...

  8. IO操作之ObjectInputStream与ObjectOutputStream

    之前写过DataInputStream和DataOutputStream,使用这两个类可以对java基本数据类型进行序列化和反序列化. 本篇再来两个新东西:ObjectInputStream,Obje ...

  9. Java IO: 序列化与ObjectInputStream、ObjectOutputStream

    作者:Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和O ...

  10. Java IO(六) ObjectInputStream 和 ObjectOutputStream

    Java IO(六) ObjectInputStream 和 ObjectOutputStream 一.介绍 对于对象数据的处理,Java IO 提供了 ObjectInputStream 和 Obj ...

随机推荐

  1. AgileTC linux部署

    简介 AgileTC是一套敏捷的测试用例管理平台,支持测试用例管理.执行计划管理.进度计算.多人实时协同等能力,方便测试人员对用例进行管理和沉淀.产品以脑图方式编辑可快速上手,用例关联需求形成流程闭环 ...

  2. 微信小程序云开发-数据库-获取用户添加的数据到数据库

    一.列表页面新增[添加商品]按钮 在列表页增加[添加商品]按钮,按钮绑定事件toAdd(),用户点击该按钮跳转到添加商品页面. 在js文件中写toAdd()函数,作用是点击[添加商品]按钮,跳转到[添 ...

  3. Delimiter must not be alphanumeric or backslash php报错原因

    昨天写了一个小程序,其中用到了正则表达式去匹配内容.  php源代码如下: preg_match("\b(\w+)\b\s+\1\b",$match):   此报错警告的中文意思是 ...

  4. 【洛谷P1816 忠诚】线段树

    题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了 ...

  5. TypeError: attrib() got an unexpected keyword argument 'convert'

    使用pyinstaller -F aaa.py时,报错 TypeError: attrib() got an unexpected keyword argument 'convert' 没有exe生成 ...

  6. Python -- 值转换为字符串的两种机制

    可以通过以下两个函数来使用这两种机制:一是通过str函数,它会把值转换为合理形式的字符串,以便用户可以理解:而repr会创建一个字符串,它以合法的Python表达式的形式来表示值.下面是一些例子: & ...

  7. 一文彻底弄懂cookie、session、token

    前言 作为一个JAVA开发,之前有好几次出去面试,面试官都问我,JAVAWeb掌握的怎么样,我当时就不知道怎么回答,Web,日常开发中用的是什么?今天我们来说说JAVAWeb最应该掌握的三个内容. 发 ...

  8. 简明易懂,将细节隐藏,面向新手树立web开发概念——学完Java基础语法,超快速上手springboot+mybatiJavaWeb开发

    简明易懂,将细节隐藏,面向新手树立web开发概念 --学完Java基础语法,超快速上手JavaWeb开发 Web本质(先忽视各种协议) Web应用可以理解为浏览器和服务器之间的交互. 我们可以看一个简 ...

  9. RHCSA_DAY07

    echo $PATH 用户账号管理 用户账号的作用:用户账号可用来登录系统,可以实现访问控制 用户模板目录:/etc/skel/ [root@localhost ~]# ls -a /etc/skel ...

  10. 了解cookie和storage的区别及优缺点

    共同点:用于数据的存储. 区别: 1.是否需要添加到http请求头? HTTP Cookie(cookie):在客户端存储会话信息,要求服务器对任意HTTP请求发送set-cookie HTTP头作为 ...