您的位置:首页 > 编程语言 > Java开发

Java对象的序列化

2016-05-31 22:25 519 查看
前言:

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



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>

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

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

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

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: