名词解释
序列化:将Java对象转化成字节的过程
反序列化:将字节转化成Java对象的过程
字节:1字节(byte)= 8bit,bit就是计算机认识的二进制
序列化的作用
Java对象是在Java虚拟机中使用的,一旦Java进程结束,对象就会消失,要将只有虚拟机才认识的对象,保存在磁盘中,必须将对象转化成字节。
- 在RPC中的用处:序列化将对象转换为字节流,然后通过网络传输进行发送
- 保存对象的状态:当Java进程需要重启时,可以将对象序列化后保存在文件中,对象的状态不会因为进程的关闭而丢失
如何进行序列化
基本数据类型转为字节的思路
对于有多个字节的数据,用移位运算符,将每8位进行移位,用一个字节保存
- Int类型:一个int有4个字节,可以创建一个长度为4的字节数组进行保存(short,long类似)
- char类型:一个char有2个字节,用相应长度的字节数组保存后,反序列化时再强制转化为char
- String类型:String的值主要是一个char数组,创建一个大小为char数组两倍的字节数组进行保存,反序列化时再转化为String
- Double和Float类型:过程比较复杂(没学会),建议直接调用工具类
一个字节和其他类型的转换工具类
import java.nio.ByteBuffer; public class ByteUtils { public static byte[] short2bytes(short v) { byte[] b = new byte[4]; b[1] = (byte) v; b[0] = (byte) (v >>> 8); return b; } public static byte[] String2bytes(String str){ char[] chars = str.toCharArray(); byte[] charByte = new byte[chars.length*2]; for (int i = 0; i < chars.length; i++) { charByte[i*2] = (byte) (chars[i] >>> 8); charByte[i*2+1] = (byte) (chars[i]); } return charByte; } public static byte[] int2bytes(int v) { byte[] b = new byte[4]; b[3] = (byte) v; b[2] = (byte) (v >>> 8); b[1] = (byte) (v >>> 16); b[0] = (byte) (v >>> 24); return b; } public static byte[] long2bytes(long v) { byte[] b = new byte[8]; b[7] = (byte) v; b[6] = (byte) (v >>> 8); b[5] = (byte) (v >>> 16); b[4] = (byte) (v >>> 24); b[3] = (byte) (v >>> 32); b[2] = (byte) (v >>> 40); b[1] = (byte) (v >>> 48); b[0] = (byte) (v >>> 56); return b; } public static byte[] double2bytes(double d){