明天理解了 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 关键字润饰的变量反序列失败噢。