https://www.cnblogs.com/kubixuesheng/p/10350523.html#_label2
个人总结:
1.序列化是将对象转化为流的操作,以便于对象在网络间的传输。
2.没有实现序列化接口就不能被序列化。
3.使用暂态关键词transient修饰的将不被序列化。
4.实现序列化接口会被自动序列化,也可实现Externalizable进行手动实现序列化和反序列化方法。
5.序列化对象时,对象中的所有对象及对象的引用都会无限的序列化下去,如果有某些容器类型的对象可能会导致流内容过大。
6.序列化的安全性,通过抓包、解析可以看到类的详细信息,如果不加密就直接可以反序列化出原来的类,所以不加密会有安全隐患。对于用户隐私信息、密码等在序列化时更需加密,应结合加密算法手动序列化,在反序列化时相应解密。
7.对象中含有目标机器无法创建的状态时,对象也不能被序列化,如HttpServletRequest、Connection等??具体哪些内容不能序列化?
8.springmvc控制层数据传输时,会使用jackson/fastjson??将对象序列化成字符串,所以我们定义的接口返回值不实现序列化也能被解析,当返回值不能被序列化时会抛出异常。
9.serialVersionUID不手动指定,程序会自动创建(具体规则??),为了明确版本,我们都应指定随机的serialVersionUID。
10.在判断反序列化对象是否相等,能否反序列化时,都会优先判断serialVersionUID,所以也不能随意修改。
附加1:序列化的帮助类
package util;
import java.io.*;
public class SerializableUtil {
public static byte[] tobyte(Object object) {
// 输出流ByteArrayOutputStream是跟字节交互的
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 输出流 ObjectOutputStream 是跟对象交互的 可以吧对象转换成ByteArrayOutputStream输出流
ObjectOutputStream oos;
byte[] bytes = null;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
bytes = baos.toByteArray();
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
return bytes;
}
public static Object frombyte(byte[] bytes) {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
ObjectInputStream ois;
try {
ois = new ObjectInputStream(byteArrayInputStream);
byteArrayInputStream.close();
return ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void toFile(Object object,String filename) {
try {
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream(filename));
os.writeObject(object);
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object readFile(String filename) {
ObjectInputStream is = null;
try {
is = new ObjectInputStream(new FileInputStream(filename));
Object object = is.readObject();
is.close();
return object;
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}