明天理解了RPC调用的一些基本原理和介绍,对于在近程调用办法的时候对象的传输中序列化serializabel的作用也更加清晰,故记录下
很多人感觉本人写得 Java 代码中,新建的 pojo 对象要实现序列化是为了要保留到硬盘上,其实呢,实现序列化和保留到硬盘上没有必然的关系。
- 很多人在初学序列化操作的时候,个别都是了解为对象通过序列化保留在磁盘上的字节流文件,后又通过字节流反向读取为对象。
- 咱们将 Java对象转换成公共的格局叫做序列化,将公共的格局转换成对象叫做反序列化。保留到磁盘只是序列化的一种表现形式。
实现序列化的起因
- 将对象的状态保留在存储媒体中以便能够在当前从新创立出完全相同的正本
- 将对象从一个应用程序域发送至另一个应用程序域。实现serializabel接口的作用是就是能够把对象存到字节流,而后能够复原,而网络传输的根底则是字节流,故既能够近程传输,又能够本地化复原。(Ps:不实现序列化接口得话,服务器并不能辨认其为对象类型,这是要害)
什么时候须要序列化
- 当你想用套接字在网络上传送对象的时候;
- 当你想把的内存中的对象写入到硬盘的时候;
- 当你想通过RMI传输对象的时候;(近程调用办法,如RPC)
Json和serializabel比照
- 长度方面,Json比serializabel小
- 速度方面,Json比serializabel快,但序列化算法如同并不止一种
- 示意方面,Json个别示意字符串,如果前端要将其解决为对象,须要额定的解决,而serializabel则间接复原
Json和serializabel抉择
- 序列化应用serialize,特地是对象的存储。这是其存在的意义。
- 与对象无关的数据存储能够应用json,如蕴含大量数字的数组等。只是当遇到这种状况,咱们须要做的可能是重构数据库了。
- 数据交换时应用JSON,这也是其定义所在。
- 目前JSON是能用于UTF-8编码的数据
## Java序列化的相干知识点
- Java序列化有两种形式,一种是实现Serializable接口。
- 另一种是实现Exteranlizable接口。而实现Exteranlizable接口的时候,咱们须要重写writeExternal和readExternal办法,它的效率比Serializable高一些,并且能够决定哪些属性须要序列化(即便是transient润饰的),然而对大量对象,或者反复对象,则效率低。
- 动态变量是不会被序列化的,即便没有transient关键字润饰
## serializabel的例子
对象
import java.io.*;public class Employee implements Serializable //实现了序列化{ public String name; public String address; public transient int SSN; //transient等下再讲 public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); }}
序列化
import java.io.*;class SerializeDemo{ public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("C:\\Users\\Ryan\\Desktop\\obj.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in obj.ser"); }catch(IOException i) { i.printStackTrace(); } }}
反序列化
import java.io.*;public class Deserializable{ public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("C:\\Users\\Ryan\\Desktop\\obj.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); }catch(IOException i) { i.printStackTrace(); return; }catch(ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); }}
彩蛋
transient关键字润饰的变量反序列失败噢。