Java对象的序列化

原创 2016年05月31日 22:25:18

前言:

对象序列化的目的是为了保存对象的状态,以便下次方便恢复此个对象的状态;其具体步骤分为两步:


1>进行序列化操作:

FileOutputStream fileOutputStream = new FileOutputStream("test.ser");
            ObjectOutputStream objectOutputStream = 
                                    new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(testSerializable);
其中,testSerializable是我们进行保存的对象;


2>解序列化操作:

FileInputStream fileInputStream = new FileInputStream("test.ser");
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            TestSerializable test_Serializ_able = 
                                        (TestSerializable) objectInputStream.readObject();
其中,test_Serializ_able是我们进行解序列化出来的对象;


代码示例如下:

package com.example.TestSerializable;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * Created by Administrator on 2016/5/31.
 */
public class TestSerializable implements Serializable {

    private String testString;
    /***
     * 静态变量
     * **/
    private static int testInt;

    /***
     * transient:表示此实例变量不会进行序列化操作
     * **/
    private transient short testShort;

    public static void main(String[] strings){

        /***
         * 对象一对三个实例变量赋值
         * ***/
        TestSerializable testSerializable = new TestSerializable();
        testSerializable.testString = "just for test Serializable";
        testSerializable.testInt = 20;
        testSerializable.testShort = 40;

        /***
         *将对象一testSerializable对象进行序列化
         * **/
        try {
            FileOutputStream fileOutputStream = new FileOutputStream("test.ser");
            ObjectOutputStream objectOutputStream =
                                    new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(testSerializable);
            System.out.println("testString:" + testSerializable.testString);
            System.out.println("testInt:" + testSerializable.testInt);
            System.out.println("testShort:" + testSerializable.testShort);
            System.out.println("1------------1------------1");
        } catch (Exception e) {
            e.printStackTrace();
        }

        /***
         * 对象二对其中的static变量再次修改其值
         * **/
        TestSerializable testStaticSerializable = new TestSerializable();
        testStaticSerializable.testInt = 60;

        /****
         * 解序列化对象一testSerializable
         * **/
        try {
            FileInputStream fileInputStream = new FileInputStream("test.ser");
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            TestSerializable test_Serializ_able =
                                        (TestSerializable) objectInputStream.readObject();
            System.out.println("testString:" + test_Serializ_able.testString);
            System.out.println("testInt:" + test_Serializ_able.testInt);
            System.out.println("testShort:" + test_Serializ_able.testShort);
            System.out.println("2------------2------------2");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

运行结果如下:



代码分析:

1>

通过输出信息testString这两个实例变量,我们可以看到,当某个对象的状态发生改变之后,我们将其保存,然后再取出来,其值是可以恢复回来的,

这主要得益于我们自定义的TestSerializable这个类已经实现了Serializable这个接口,所以我们才能进行序列化操作;

2>

通过输出信息testShort这个实例变量,我们发现,其输出信息恢复回来时,已经变为0了,不再是之前的 40 ,这主要是由于

testShort这个实例变量前面已经声明为transient了,当一个变量声明为transient之后,则表示在对对象进行序列化操作时,

忽略对此变量的序列化操作;所以当恢复时,则这个被transient修饰的变量会恢复为null或者0;

3>

从testInt这个实例变量,我们可以看出,其保存进去的值和取出来的值已经不一样,主要是因为其是static的,

属于类的所有对象所共享,所以当有对象对其修改时,其取出来的值自然也就会跟着变成修改之后的值


总结:

1>

对象必须实现序列化这个接口才能被序列化。如果父类实现序列化,则自雷也就自动地有实心,而不管是否

有明确的声明,当对象被序列化时,整个对象版图都会被序列化。这代表它的实例变量所引用的对象也会被

序列化。如果有不能序列化的对象,执行期间就会抛出异常。除非该实例变量被标记为transient。否则,该

变量在还原的时候会被赋予null或者primitive主数据类型的默认值。

2>

静态变量不会被序列化,因为所有对象都共享一份静态变量值。当对象一序列化被还原时,静态变量会维持类中原本的样子,

而不是存储时的样子。也就是说,若中途对象二对静态变量做了修改,那么,对象一的静态变量被还原时,已不是当时存储的

值了,而是对象而对这个静态变量修改之后的结果




关注微信公众号获取更多资讯


版权声明:本文为博主原创文章,转载请注明出处

Java对象序列化详解

所有分布式应用常常需要跨平台,跨网络,因此要求所有传的参数、返回值都必须实现序列化。一、定义  序列化:把Java对象转换为字节序列的过程。      反序列化:把字节序列恢复为Java对象的过程...
  • zcl_love_wx
  • zcl_love_wx
  • 2016年08月10日 14:47
  • 4332

Java 对象序列化机制详解

对象序列化的目标:将对象保存到磁盘中,或允许在网络中直接传输对象。 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,通过网络将这种二进制流...
  • zuiwuyuan
  • zuiwuyuan
  • 2014年10月09日 22:24
  • 1066

Java序列化对象的存储和读取

本文通过一个示例讲解java序列化对象的存储和读取存储文件使用的是:ObjectOutputStream和它的方法writeObject来进行写入对象,可以写入任何类型的数据;读取文件使用Object...
  • wenzhi20102321
  • wenzhi20102321
  • 2016年11月13日 11:35
  • 2281

java序列化之后,对象的引用关系?

今天写代码的时候用到序列化,不过突然想到这个问题。 于是写了一些测试代码,得出两个结论。 如果两个对象存在引用关系,比如A引用B。 如果两个对象是各自序列化的,则引用关系不再存在。 如果两个对象是是...
  • linger2012liu
  • linger2012liu
  • 2014年07月24日 19:44
  • 1947

Java序列化对象的存储和读取

本文对javaIO流中序列化徐对象的写入和读取方法做示例演示。
  • wenzhi20102321
  • wenzhi20102321
  • 2016年09月30日 13:41
  • 1326

java JSONObject对象序列化与反序列化

首先需要导入一下包 json-lib-2.3-jdk15.jar  commons-beanutils-1.7.0.jar  commons-httpclient-3.1.jar  commons-l...
  • Mr_linjw
  • Mr_linjw
  • 2016年02月17日 17:08
  • 4526

Java中对象序列化的作用是什么?java RMI是什么意思?

转自:http://hi.baidu.com/lanqibaoer/item/9366062187f7271642634a2f ***Java中对象序列化的作用是什么?   1、序列化是干...
  • onlyonename
  • onlyonename
  • 2013年01月02日 12:21
  • 2814

Java中对象集合的序列化

java的IO中提供了一个 ObjectOutputStream对象,其中的方法writeObject()文档如下: /** * Write the specified object...
  • d8111
  • d8111
  • 2015年04月24日 17:48
  • 7283

怎样对带有不可序列化属性的Java对象进行序列化

出于很多原因我们想使用自定义的序列化方法取代Java默认的机制。一个最常见的原因是提高性能,而另一个原因是有时候我们无法使用默认的序列化方法。在这篇文章中,我们具体来讨论怎样通过定制的序列化方法,对一...
  • CSDN_LQR
  • CSDN_LQR
  • 2016年05月20日 20:32
  • 2013

Java Socket传输对象(序列化)

1.首先需要一个普通的对象类,由于需要序列化这个对象以便在网络上传输,所以实现java.io.Serializable接口就是必不可少的了...
  • SHEN525758203
  • SHEN525758203
  • 2014年08月08日 13:58
  • 2461
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java对象的序列化
举报原因:
原因补充:

(最多只允许输入30个字)