Java对象的序列化
2016-05-31 22:25
519 查看
前言:
对象序列化的目的是为了保存对象的状态,以便下次方便恢复此个对象的状态;其具体步骤分为两步:
1>进行序列化操作:
其中,testSerializable是我们进行保存的对象;
2>解序列化操作:
其中,test_Serializ_able是我们进行解序列化出来的对象;
代码示例如下:
运行结果如下:
代码分析:
1>
通过输出信息testString这两个实例变量,我们可以看到,当某个对象的状态发生改变之后,我们将其保存,然后再取出来,其值是可以恢复回来的,
这主要得益于我们自定义的TestSerializable这个类已经实现了Serializable这个接口,所以我们才能进行序列化操作;
2>
通过输出信息testShort这个实例变量,我们发现,其输出信息恢复回来时,已经变为0了,不再是之前的 40 ,这主要是由于
testShort这个实例变量前面已经声明为transient了,当一个变量声明为transient之后,则表示在对对象进行序列化操作时,
忽略对此变量的序列化操作;所以当恢复时,则这个被transient修饰的变量会恢复为null或者0;
3>
从testInt这个实例变量,我们可以看出,其保存进去的值和取出来的值已经不一样,主要是因为其是static的,
属于类的所有对象所共享,所以当有对象对其修改时,其取出来的值自然也就会跟着变成修改之后的值
总结:
1>
对象必须实现序列化这个接口才能被序列化。如果父类实现序列化,则自雷也就自动地有实心,而不管是否
有明确的声明,当对象被序列化时,整个对象版图都会被序列化。这代表它的实例变量所引用的对象也会被
序列化。如果有不能序列化的对象,执行期间就会抛出异常。除非该实例变量被标记为transient。否则,该
变量在还原的时候会被赋予null或者primitive主数据类型的默认值。
2>
静态变量不会被序列化,因为所有对象都共享一份静态变量值。当对象一序列化被还原时,静态变量会维持类中原本的样子,
而不是存储时的样子。也就是说,若中途对象二对静态变量做了修改,那么,对象一的静态变量被还原时,已不是当时存储的
值了,而是对象而对这个静态变量修改之后的结果
关注微信公众号获取更多资讯
对象序列化的目的是为了保存对象的状态,以便下次方便恢复此个对象的状态;其具体步骤分为两步:
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>
静态变量不会被序列化,因为所有对象都共享一份静态变量值。当对象一序列化被还原时,静态变量会维持类中原本的样子,
而不是存储时的样子。也就是说,若中途对象二对静态变量做了修改,那么,对象一的静态变量被还原时,已不是当时存储的
值了,而是对象而对这个静态变量修改之后的结果
关注微信公众号获取更多资讯
相关文章推荐
- ajax跨域请求简单实现Java后台
- 开发 JAVA 的准备
- java 基础类库(IO,集合类,线程)
- Java ClassLoader 原理详细分析
- #VSTS日志# Xamarin构建支持和一大波更新
- Java8新特性 1——利用流和Lambda操作集合
- 手机蓝牙传输图片很邪恶的一个点
- 【Java】从源码分析动态代理机制
- 南邮java实验一—综合图形界面程序设计
- spring基于@ExceptionHandler的异常处理
- Java Code Examples for java.net.Authenticator
- Spring04
- 在Java中使用Highcharts+Ajax+Json生成动态饼图
- 【Java基础一】String创建对象"" && null
- Retrofit结合RxJava的一次实践
- java依赖注入的学习
- [疯狂Java]集合:IdentityHashMap、EnumMap
- java的单例设计模式
- 【java集合一】根接口Collection、Map
- Spring AOP 最终版实现