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>

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

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

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




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


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

相关文章推荐

什么是primitive主数据类型呢

primitive就是int,double,boolean这些数据类型,它们不是对象,只是内存里的几个字节空间而已。注意int是primitive,而Integer不是!Integer是一个类。jav...

java的primitive主数据类型和引用

前言: 在java中,变量分为两种, 一种是primitive主数据类型,也称之其为基本数据类型, 还有一种是引用数据类型;下面就这两种类型分别展开进行讨论; primitive主数据类型 pri...

java对象的序列化

Java对象序列化的秘密.pdf

  • 2013-04-18 15:15
  • 2.85MB
  • 下载

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

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

JAVA_对象序列化

  • 2012-08-16 13:02
  • 51KB
  • 下载

java基础 对象序列化

  • 2011-11-21 08:59
  • 304KB
  • 下载

Java对象序列化

对象序列化的作用使对象具有持久化的机制,用例子的方式来讲解了机制对象序列化的方式
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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