天天看点

分布式——4.java序列化及常用序列化框架对比

RPC概念

RPC(remote procedure call) 远程过程调用协议,调用远程的函数就像调用本地函数一样简单,

对于调用者屏蔽了底层的通信细节。

RPC的特点:

1.跨平台

2.跨语言

序列化概念

在分布式系统中,服务间相互调用的时需要传递一些数据,将程序中的状态信息转化为可以存储或传输数据的过程称为对象的序列化,相反将数据转化为程序中状态的过程称为反序列化。

java中序列化

java中也是支持将对象序列化为二进制字节流的,下面介绍一下java序列化需要注意的事项

1.序列化对象需要实现Serializable接口

2.序列化id serialVersionUID

序列化时会将此版本号写入到字节序列中,在反序列化时会验证JVM中类的UID与字节序列中的UID是否一致,若不一致反序列化会抛出异常

java.io.InvalidClassException: com.xum.serialzation.User; local class incompatible: stream classdesc serialVersionUID = -4130457773954725705, local class serialVersionUID = -4977057097396469728
	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
	at com.xum.serialzation.SerializableTest.deSerial(SerializableTest.java:33)
	at com.xum.serialzation.SerializableTest.main(SerializableTest.java:13)
           

序列化id可有可无,当没有定义时,jvm会根据文件的内容生成一个,当文件内容有变化时,生成的id会改变。

3.序列化版本号一致时,并不会验证JVM中类与字节序列流中的字段的一致性。

如序列化时,User类中有name和age两个属性,在反序列化时为name和sex两个属性,也是可以序列化成功的。

序列化时类的信息
@Data
public class User implements Serializable {
    public static final long serialVersionUID = 1L;
    private String name;
    private int age;
}
反序列化时类的信息
@Data
public class User implements Serializable {
    public static final long serialVersionUID = 1L;
    private String name;
    private boolean sex;
//    private int age;
}
           

4.类的静态变量不会参与序列化

5.transient 修饰的成员变量序列化时会被忽略

6.序列化子类时,如果父类没有实现Serializable接口,父类不会被序列化

7.序列化可以实现类的深拷贝

8.反序列化时不会调用类的构造函数

未完待续.

继续阅读