serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法
ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入
Serializable其实是一个空接口
package java.io;
public interface Serializable {
}
Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。 什么情况下需要序列化
a)当你想把的内存中的对象写入到硬盘的时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候; 再稍微解释一下:a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
public static void main(String args[]) throws Exception {
class Student implements Serializable {
private static final long serialVersionUID = 0xbc9903f7986df52fL;
String name;
int id ;
int age;
String department;
public Student(String name, int id, int age, String department) {
this.age = age;
this.department = department;
this.id = id;
this.name = name;
}
}
Student s1=new Student("张2三", 1, 5, "化学");
Student s2=new Student("李四1", 2, 9, "生物");
FileOutputStream fout = new FileOutputStream("C:\\student.txt");
ObjectOutputStream out=new ObjectOutputStream(fout);
out.writeObject(s1);
out.writeObject(s2);
out.close();
FileInputStream fin=new FileInputStream("C:\\student.txt");
ObjectInputStream in=new ObjectInputStream(fin);
try {
s1=(Student) in.readObject();
s2=(Student) in.readObject();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
in.close();
System.out.print("name:"+s1.name);
System.out.print(" id:"+s1.id);
System.out.print(" age:"+s1.age);
System.out.println(" department:"+s1.department);
System.out.print("name:"+s2.name);
System.out.print(" id:"+s2.id);
System.out.print(" age:"+s2.age);
System.out.println(" department:"+s2.department);
}
上面就是一个序列化反序列化的例子
然后我们考虑以下几个问题
问题一:假设有A端和B端,如果2处的serialVersionUID不一致,会产生什么错误呢?
问题二:假设2处serialVersionUID一致,如果A端增加一个字段,B端不变,会是什么情况呢?
问题三:假设2处serialVersionUID一致,如果B段增加一个字段,A端不变,会是什么情况呢?
问题四:假设2处serialVersionUID一致,如果A端减少一个字段,B端不变,会是什么情况呢?
问题五:假设2处serialVersionUID一致,如果B端减少一个字段,A端不变,会是什么情况呢?
serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法的更多相关文章
- ObjectInputStream与ObjectOutputStream类实现对象的存取
1. ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 ...
- Java中的实体类--Serializable接口、transient 关键字
在java中,实体类是一个非常重要的概念,我们可以在实体类中封装对象.设置其属性和方法等.关于实体类,也经常涉及到适配器模式.装饰者模式等设计模式.那么在实际代码开发中,关于实体类的注意事项有哪些呢? ...
- Java IO(六) ObjectInputStream 和 ObjectOutputStream
Java IO(六) ObjectInputStream 和 ObjectOutputStream 一.介绍 对于对象数据的处理,Java IO 提供了 ObjectInputStream 和 Obj ...
- 序列化和反序列化为什么要实现Serializable接口?(史上最全、简单易懂)
目录结 前言 1.什么是序列化和反序列化 2.什么时候需要进行序列化和反序列化 2.1.服务器和浏览器交互时用到了Serializable接口吗? 2.2.Mybatis将数据持久化到数据库中用到了S ...
- Java IO: 序列化与ObjectInputStream、ObjectOutputStream
作者:Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和O ...
- 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成
写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...
- Idea中类实现Serializable接口 引入 serialVersionUID
idea实现Serializable接口,然后打出serialVersionUID的办法 setting>editor>Inspection>Java>Serializatio ...
- Java中实现Serializable接口为什么要声明serialVersionUID?
什么情况下需要修改serialVersionUID 的值? 序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化 ...
- 序列化、反序列化(实体类或要序列化的对象类必须实现Serializable接口)
package com.phone.shuyinghengxie; import java.io.Serializable; /* 一个类的对象要想序列化成功,必须满足两个条件: 该类必须实现 jav ...
随机推荐
- C and SQL data types for ODBC and CLI
C and SQL data types for ODBC and CLI This topic lists the C and SQL data types for ODBC and CLI a ...
- ubuntu selinux
apt install selinux-utils apt install policycoreutils https://zhidao.baidu.com/question/917938889387 ...
- IBatis.Net使用总结(四)-- IBatis 调用存储过程
IBatis 调用存储过程 http://www.cnblogs.com/jeffwongishandsome/archive/2010/01/10/1543219.html http://www.c ...
- trie树模型
可以用来表达所有的0,1选择..或者多阶段有限字符集的表达
- TOMCAT-报错The BASEDIR environment variable is not defined correctly
<span style="font-size:18px;">The BASEDIR environment variable is not defined correc ...
- Eclipse '/RemoteSystemsTempFiles'错误
错误代码 Could not write metadata for '/RemoteSystemsTempFiles'.D:\workspace4.5\.metadata\.plugins\org.e ...
- [spring源码学习]单元测试演化
1.使用main方法 最早的测试方法一般是在类中增加main方法,然后在main方法中增加对每个方法的测试代码,如果要测其中一个,就屏蔽掉其他的测试代码,执行后,根据log的打印来判断测试是否成功 2 ...
- iOS路径沙盒文件管理(转载)
iOS路径沙盒文件管理,看到博主总结的很好,转载过来,原文:http://www.aichengxu.com/view/35264 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文 ...
- 如何在EF中实现left join(左联接)查询
在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...
- QT5之三大重要窗体
当创建项目时,会发现编辑器提供三个基类,分别为:QMainWindow.QWidget.QDialog,三个基类的区别说明如下.1.QMainWindowQMainWindow类提供一个有菜单条.锚接 ...