java序列化(一)
今天我们来探讨一下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序列化(一)的更多相关文章
- Java 序列化与反序列化
		1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ... 
- Java序列化与反序列化
		Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ... 
- java序列化
		什么是java序列化,如何实现java序列化? 我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机 ... 
- Java 序列化Serializable详解
		Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ... 
- 关于java序列化中的一个细节
		java序列化机制的可以参考很多资料了,最近在看的时候发现了一些问题. 1. 默认的序列化机制,很多书里讲到序列化类只序列化类名,实例变量,不会实例化类变量(static)和瞬态变量(transien ... 
- 各种Java序列化性能比较
		转载:http://www.jdon.com/concurrent/serialization.html 这里比较Java对象序列化 XML JSON Kryo POF等序列化性能比较. 很多人以 ... 
- Java序列化格式详解
		RPC的世界,由于涉及到进程间网络远程通信,不可避免的需要将信息序列化后在网络间传送,序列化有两大流派: 文本和二进制. 文本序列化 序列化的实现有很多方式,在异构系统中最常用的就是定义成人类可读的文 ... 
- 简述java序列化
		1. 什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期 ... 
- 透过byte数组简单分析Java序列化、Kryo、ProtoBuf序列化
		序列化在高性能网络编程.分布式系统开发中是举足轻重的之前有用过Java序列化.ProtocolBuffer等,在这篇文章这里中简单分析序列化后的byte数组观察各种序列化的差异与性能,这里主要分析Ja ... 
- [转] Java序列化与反序列化
		原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ... 
随机推荐
- win10 uwp xaml 绑定接口
			本文告诉大家如何在 xaml 绑定属性使用显式继承接口 早上快乐 就在你的心问了我一个问题,他使用的属性是显式继承,但是无法在xaml绑定 我写了简单的代码,一个接口和属性 public class ... 
- Vue 小实例 跑马灯效果
			<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- 2018.10.26 浪在ACM 集训队第二次测试赛
			2018.10.26 浪在ACM 集训队第二次测试赛 整理人:苗学林 A海港 参考博客:[1]:李继朋https://www.cnblogs.com/violet-acmer/p/9859006.ht ... 
- 2018-2-13-win10-uwp-从Type使用构造
			title author date CreateTime categories win10 uwp 从Type使用构造 lindexi 2018-2-13 17:23:3 +0800 2018-2-1 ... 
- 【37.48%】【hdu 2587】How far away ?(3篇文章,3种做法,LCA之树上倍增)
			Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ... 
- 用ubuntu里的vim搭建一个apache2+php+mysql环境一路踩的坑
			先是安装apache2,这个很顺利,一个apt install apache就搞定了. (PS:查看linux是否已经安装了apache服务,可以通过执行apachectl -v,如果安装了的话会显示 ... 
- Sybase commands
			(1)update table statistics $table name if we change index info for a table ,such as create or drop i ... 
- 无法加载文件C:\Users\TANG\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本
			# 碰到问题解决过程 > 1. 刚在一个新的机器上装node环境时,要用一个nrm管理镜像源时.报了一个错,如图1  In [4]: SYS.path 如果导入模块在多级文件夹下 ... 
- 泛型 List转换成DataTable
			private DataTable listToDataTable<T>(List<T> ListItem) { //实列化DataTable对象 var dt = new D ... 
