我非常喜欢通过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.看起来很有希望.