而且如果不调用这些默认方法,我们的对象将不会被序列化/反序列化
默认的序列化过程是完全递归的。 因此每当我们尝试序列化一个对象时,序列化过程就会尝试使用我们的类(除静态的和短暂的字段) 这使得序列化过程非常缓慢。
现在假设我们有一个对象,其中包含很多字段由于某些原因,我们不想序列化这些字段(这些字段将始终分配有默认值) 使用默认的序列化过程,我们将必须使所有这些字段都是瞬态的但是它仍然不会高效,因为会进行大量检查以查看这些字段是否为瞬态的
因此,正如我们所看到的使用默认序列化过程有很多缺点,例如:
正如我们在上面看到的默认的Java序列化效率不高。 我们可以通过使用以下方法解决其中一些问题可外部化接口代替可序列化接口
因此,非常仔细地对测试这些方法进行編码非常必要因为这可能会破坏序列化过程。 但是如果正确实现,与默认序列化过程相比外部化过程非常快。
我们将在下面使用雇員类对象作为说明的示例:
该对象可以实现readExternal方法来恢复其内容方法是针对原始类型调用DataInput方法,对于对象字符串和数组调用readObject方法。 readExternal方法必须按与writeExternal相同的顺序和相同的类型读取值
的可外部化interface是的子接口可序列化即可外部化 extends 可序列化。 所以如果我们实施可外部化接口并覆盖其writeExternal()和readExternal()然后将优先选择这些方法,而不是使用JVM提供的默认序列化机制
重建Externizable对象时,在调用readExternal方法之前使用公共的无参数构造函數创建对象。 如果不存在公共的无参数构造函数则在运行时引发InvalidClassException。使用Externalizable我们甚至可以序列化/反序列化瞬态变量,因此无需声明字段瞬態使用Externalizable,我们甚至可以根据需要对静态变量进行序列化/反序列化
数据集bb就可以带入模型了
除上述以外对RDD还存在一些常见数据操作如:
count()返回rdd的元素个数