java对象的序列化和反序列化
Posted inspire0x001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java对象的序列化和反序列化相关的知识,希望对你有一定的参考价值。
一,对象的序列化,反序列化
1.对象的序列化,就是将Object转换成byte序列,反之叫对象的反序列化
2.做序列化需要有流类,序列化流(ObjectOutputStream),是(字节的)过滤流,有writeObject方法,写一个对象
反序列化 流(ObjectInputStream)----readObject
3.序列化接口(Serializable)
对象必须实现序列化接口,才能进行序列化,否则将出现异常
这个接口,没有任何方法,只是一个标准
/**
* 如果将来希望这个对象能在网络中传输,也需要把这个对象进行序列化。(在网络中是以字节为单位进行传输的)
* 所以当我们要保存这个对象,或在网络中传输这个对象时,都需要对这个对象进行序列化
*/
二,transient关键字
一个对象中有些属性不需要序列化,可以用transient关键子修饰。
用transient修饰的元素,该元素不会进行jvm默认的序列化。也可以自己完成这个元素的序列化
(在网络传输中,有些元素不需要传输,也就不用序列化,这样可以节省网络传输的流量)
如何自己完成序列化呢?
有两个方法签名可以实现。可以参考ArrayList里的两个方法 :
writeObject(java.io.ObjectOutputStream s),readObject(java.io.ObjectInputStream s)
ArrayList序列化优化的问题(ArrayList源码)
ArrayList底层是数组,但我们往list中添加数据时,有添加不满的情况。数组中为空的元素就不用序列化了,这样可以提高性能
package com.amazing.jdk.learn2Serializable.basicSerializable_08_15; import java.io.Serializable; /** * Created by yaming on 17-8-15. */ public class Student implements Serializable { private Long id; private String name; private char gender; private transient double money; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public char getGender() { return gender; } public void setGender(char gender) { this.gender = gender; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } @Override public String toString() { return "Student{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ", gender=" + gender + ", money=" + money + ‘}‘; } //自己实现序列化 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ s.defaultWriteObject();//把jvm能默认序列化的元素进行序列化 s.writeDouble(money);//自己完成money的序列化,也可以用s.writeObject(money) } //自己实现反序列化 private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject();//把jvm能默认反序列化的元素进行反序列化 this.money=s.readDouble();//自己完成money的反序列化 } }
以上是关于java对象的序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章