我可以(轻松地)使用第三方库来处理Java RMI的序列化吗?

我非常喜欢通过Java的RMI调用远程方法的简单性,但是其序列化格式的冗长性是一个主要的嗡嗡声(是的,我已经进行了基准测试,谢谢).在设计RPC(松散地说)组件时,Sun的建筑师似乎做了明显的正确选择,但是在实现序列化时却出现了一次史诗般的失败.

相反,似乎Thrift,Avro,Kryo(尤其是),协议缓冲区(不是很多)等的架构师在设计其序列化格式时通常做了明显的正确选择,但要么都不提供RPC机制,要么提供是不必要的卷积(或不成熟),或者是比调用远程方法更适合数据传输的方法(对于许多用途来说完全可以,但不是我想要的).

因此,一个显而易见的问题是:如何使用RMI的方法调用友好性,但将上述库之一用于有线协议?无需大量工作就可以吗?我是否对上述库之一进行了过于严格的评估(请注意,总的来说,我非常不喜欢代码生成;我不喜欢某些不必要的注释,而XML配置则要多得多;任何形式的“ beans”都使我感到畏缩-我不喜欢不需要重量;理想情况下,我希望只为远程对象实现一个接口,就像使用RMI).

解决方法:

从前,我确实有相同的要求.我更改了rmi方法的参数并将类型返回为byte [].

我使用首选的序列化程序将对象序列化为字节数组,然后将其称为修改后的rmi方法.

好吧,正如您提到的Java序列化过于冗长,因此5年前,我确实实现了空间高效的序列化算法.如果要发送非常复杂的对象图,它将节省太多空间.最近,我不得不将此序列化实现移植到GWT,因为在Dev模式下GWT的序列化非常慢.

举个例子;

rmi方法

public void saveEmployee(Employee emp){
  //business code
 }

您应该像下面这样更改它,

public void saveEmployee(byte[] empByte) {
        YourPreferredSerializer serialier =   YourPreferredSerializerFactory.creteSerializer();
        Employee emp = (Employee) serializer.deSerialize(empByte);
        //business code
    }

编辑:

您应该检查MessagePack.看起来很有希望.

上一篇:java-是否有有效的方法来测试RMI服务器是否已启动?


下一篇:通过SSH v2协议的Java RMI