3.4 Java特定编码

当使用套接字时,通常要么是需要同时创建通信信道两端的程序(这种情况下也拥有了协议的完全控制权),要么实现一个给定的协议进行通信。如果知道(i)通信双方都使用Java实现,而且(ii)你拥有对协议的完全控制权,那么就可以使用Java的内置工具如Serializable接口或远程方法调用(Remote Method Invocation,RMI)工具。RMI能够调用不同Java虚拟机上的方法,并隐藏了所有烦琐的参数编码解码细节。序列化(Serialization)处理了将实际的Java对象转换成字节序列的工作,因此你可以在不同虚拟机之间传递Java对象实例。

这些能力可能就好像沟通的涅,但是在实际中,由于种种原因,它们并不总是最好的解决方案。首先,由于它们都是很笼统的工具,因而在通信开销上不能做到最高效。例如,一个对象的序列化形式,其包含的信息在Java虚拟机(JVM)环境以外是毫无意义的。其次,Serializable和Externalizable接口不能用于已经定义了不同传输格式的情况—如一个标准的协议。最后,用户自定义的类必须自己实现它们的序列化接口,而这项工作很容易出错。再强调一次,在某些情况下,这些Java的内置工具的确很有用,但是有些时候,“实现你自己的方法”可能更简单、容易或更有效。