JAVA研发面试题(基础)
JAVA基础(目录): Object类的方法,逐个解释一下(clone,hashCode,equals,wait,finalize,notify) Java的Exception类型 Integer和int有啥区别,integer中有哪些特殊的函数? 说一下String实现 intern final 关键字 序列化,远程方法调用
序列化
因为有时需要将对象存储下来,或者要在网络上传输,需要进行对象的序列化和反序列化
序列化只会保存不被临时关键字transient修饰的,属于实例对象的属性(静态变量不保存)
序列化的类需要实现Serializable接口
Java 对象的序列化和反序列化 的两种应用场景
有时候需要将 Java 对象保存永久保存,比如保存到文件中,过程:Java 对象 -> IO 对象流 -> 写入文件 -> 字符串。当我们需要将文档中的字符串恢复为 Java 对象的时候,需要相反的过程:字符串 -> 读文件 -> IO 流 -> (强制)转化为 Java 对象。
还有一种场景,在网络通信中,对象要先变为IO流经过网络传输之后,再被还原为Java对象。过程:对象 -> 写IO -> 读IO -> 对象。
序列化是一个处理对象信息的过程
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。
反序列化是将传输信息恢复为对象的过程。
Java 对象被序列化的两种方式
方式一:Java 对象所属的类需要直接或者间接实现 Serializable 接口。
方式二:Java 对象所属的类需要直接或者间接实现 Externalizable接口。这里需要注意,如果通过继承实现Externalizable接口,必须覆盖重写 writeExternal 和 readExternal 方法,否则子类新增属性无法参与序列化。
Serializable 和 Externalizable 的区别
Serializable 可以是间接或者直接实现,所在类的属性都会被序列化。
Serializable 的思路是,如果没有特殊,本类以及子类的属性将参与序列化。
Externalizable 也可以是间接实现或者直接实现,但是其参与序列化和反序列化的属性都需要通过重写方法去指定。
Model m=new Model();
m.setUserName("jecket");
m.setPassword("123456");
m.setOther("other");
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(filePath));
oos.writeObject(m);
oos.close();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(filePath));
Model m=(Model)ois.readObject();
System.out.println(m.getUserName());‘
参考:https://blog.youkuaiyun.com/bestcxx/article/details/79425136