关闭

Java对象的序列化

201人阅读 评论(0) 收藏 举报
分类:

前言:

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


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>

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

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

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




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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:156349次
    • 积分:2762
    • 等级:
    • 排名:第13071名
    • 原创:289篇
    • 转载:103篇
    • 译文:10篇
    • 评论:55条
    drinkingcode
    博客专栏
    最新评论