今天我们来探讨一下java的序列化与反序列化。之前对此一直有概念,但是并没有真正的去测试。大家都知道,所谓的序列化就是把java代码读取到一个文件中,反序列化就是从文件中读取出对象。在网络传输过程中,我们也需要对对象进行序列化,因为一个对象是不能进行传输的。下面先上代码

package serializable;

import java.io.*;

public class SerializableTest implements Serializable {
private static final Long serialVersionUID = 1L; private String name; public String sex; protected int age; private static int id; transient private float height; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public static int getId() {
return id;
} public static void setId(int id) {
SerializableTest.id = id;
} public float getHeight() {
return height;
} public void setHeight(float height) {
this.height = height;
} public static void main(String[] args) throws Exception {
serializable();
deSerializable();
} /**
* 序列化
* @throws IOException
*/
private static void serializable() throws IOException {
SerializableTest serializableTest = new SerializableTest();
serializableTest.setAge(25);
serializableTest.setId(122528);
serializableTest.setName("张三");
serializableTest.setSex("男");
serializableTest.setHeight(175); FileOutputStream fos = new FileOutputStream("serializableTest.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(serializableTest);
oos.flush();
oos.close();
} /**
* 反序列化
* @throws Exception
*/
public static void deSerializable() throws Exception{
FileInputStream fis = new FileInputStream("serializableTest.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
SerializableTest serializableTest = (SerializableTest) ois.readObject();
System.out.println("serializableTest.getAge() = " + serializableTest.getAge());
System.out.println("serializableTest.getName() = " + serializableTest.getName());
System.out.println("serializableTest.getSex() = " + serializableTest.getSex());
System.out.println("serializableTest.getHeight() = " + serializableTest.getHeight());
System.out.println("serializableTest.getId() = " + serializableTest.getId());
}
}

此类中,包括了private、public、protected、static和transient修饰的属性,我们先看下运行结果

serializableTest.getAge() = 25
serializableTest.getName() = 张三
serializableTest.getSex() = 男
serializableTest.getHeight() = 0.0
serializableTest.getId() = 122528

可以发现transient修饰的属性并没有被序列化,这也是我们所认知的。但是static修饰的属性也不应该被序列化才对,现在对象已经被我们读到文件中了,在单独执行一次反序列化方法。

    public static void main(String[] args) throws Exception {
//serializable();
deSerializable();
}

执行结果如下:

serializableTest.getAge() = 25
serializableTest.getName() = 张三
serializableTest.getSex() = 男
serializableTest.getHeight() = 0.0
serializableTest.getId() = 0

现在得到的Id的值是0,也就是这个值并没有被序列化存储到文件中。

最后再说一下序列化版本号的意义。在我的理解看来,次版本号就是为了保证程序的稳定性,如果我们不声明的话,如果开始的一个对象序列化时,会为我们自动生成一个版本,如果后面我们修改了此类,那么在反序列化的时候,会发生版本不一致的问题。所以一般我们会声明成一个定值,这样就能防止上述问题。我们可以把版本代码注释掉,运行一下反序列化结果如下:

Exception in thread "main" java.io.InvalidClassException: serializable.SerializableTest; local class incompatible: stream classdesc serialVersionUID = 4564223277371155727, local class serialVersionUID = 5130976784646098676
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at serializable.SerializableTest.deSerializable(SerializableTest.java:89)
at serializable.SerializableTest.main(SerializableTest.java:60)

java序列化(一)的更多相关文章

  1. Java 序列化与反序列化

    1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ...

  2. Java序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  3. java序列化

    什么是java序列化,如何实现java序列化? 我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机 ...

  4. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  5. 关于java序列化中的一个细节

    java序列化机制的可以参考很多资料了,最近在看的时候发现了一些问题. 1. 默认的序列化机制,很多书里讲到序列化类只序列化类名,实例变量,不会实例化类变量(static)和瞬态变量(transien ...

  6. 各种Java序列化性能比较

    转载:http://www.jdon.com/concurrent/serialization.html 这里比较Java对象序列化 XML JSON  Kryo  POF等序列化性能比较. 很多人以 ...

  7. Java序列化格式详解

    RPC的世界,由于涉及到进程间网络远程通信,不可避免的需要将信息序列化后在网络间传送,序列化有两大流派: 文本和二进制. 文本序列化 序列化的实现有很多方式,在异构系统中最常用的就是定义成人类可读的文 ...

  8. 简述java序列化

      1. 什么是Java对象序列化     Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期 ...

  9. 透过byte数组简单分析Java序列化、Kryo、ProtoBuf序列化

    序列化在高性能网络编程.分布式系统开发中是举足轻重的之前有用过Java序列化.ProtocolBuffer等,在这篇文章这里中简单分析序列化后的byte数组观察各种序列化的差异与性能,这里主要分析Ja ...

  10. [转] Java序列化与反序列化

    原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ...

随机推荐

  1. Android Studio(五):修改Android Studio项目包名

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  2. Laravel 之搜索引擎elasticsearch扩展Scout

    简介 Laravel Scout 是针对Eloquent 模型开发的一个简单的,基于驱动的全文检索系统.Scout 使用模型观察者时会自动保持你的检索索引与你的 Eloquent 记录同步. 目前,S ...

  3. U盘还原系统

    相信现在不少的人已经开始使用U盘作为启动盘来安装系统,说起来这可比用光盘装系统可是方便多了.毕竟U盘可以随身携带,至于光盘嘛,就不多说了.       可是还有许多人对U盘安装系统还是有些陌生的感觉. ...

  4. supersockets接收过滤器(ReceiveFilter)

    接收过滤器(ReceiveFilter)用于将接收到的二进制数据转化成请求实例(RequestInfo). 实现一个接收过滤器(ReceiveFilter), 你需要实现接口 IReceiveFilt ...

  5. Python--day63---出版社增删查改开发流程回顾

    1,第一步:对应url 2,第二步:views.py 3,第三步:views.py中的函数中利用ORM去数据库中操纵数据 4,第四步:Django模板语言实现字符串替换 5,第五步:取出publish ...

  6. java面向接口编程之制定标准和简单工厂模式

    制定一个标准,让别人去实现或者说满足它! Eg: interface USB{//定义USB标准 void useUSB();//USB有使用USB的行为 } 简单工厂模式 构建一个工厂出来,在里面进 ...

  7. P1097 方程的整数解

    题目描述 给定一个整数N,求方程 \(x^3-x^2-x=N\) 的整数解. 保证解的范围在 \([-100,100]\) 范围内. 输入格式 一行一个整数 \(N(-10^6<=N<=1 ...

  8. P1021 整数奇偶排序

    整数奇偶排序 题目出处:<信息学奥赛一本通>第二章上机练习6,略有改编 题目描述 告诉你包含 \(n\) 个数的数组 \(a\) ,你需要把他们按照"奇数排前面,偶数排后面:奇数 ...

  9. 改善Azure App Service托管应用程序性能的几个技巧

    本文介绍了几个技巧,这些技巧可以改善Azure App Service托管应用程序的性能.其中一些技巧是你现在就可以进行的配置变更, 而其他技巧则可能需要对应用程序进行一些重新设计和重构. 开发者都希 ...

  10. MVC3 学习笔记 之(ajax表单)

    mvc 提供了一种ajax提交表单的方式.与普通表单不同的是,它是一个异步表单. 在开始使用之前,需要引用以下文件: <script src="@Url.Content("~ ...