You really should not be using RMI for any application you build today, basically for the reasons you just laid out.
In some cases (diving into legacy or “enterprise” applications) you just have no choice.
However, if you are starting a new project, other options are:
REST + JSON over HTTP
The de-facto standard for communicating to remote services. The biggest advantage it has it that it is lightweight and easy to grasp the concept.
In theory it should require more work than RMI because you have to manually craft the available URL’s, accepted verbs in each URL etc. In practice, I would say that RMI’s boilerplate does not really help anybody.
Sticking with java, Jersey is a brilliant library to write your own RESTful web services.
If you want a batteries included solution for RESTful web services with java, Dropwizard by the nice guys at Yammer gives you a full server and framework ready to just plug in your business logic, and provides logging, database connectivity, serialization, request routing, and even metrics gathering out of the box.
SOAP
The previous standard for communicating to remote services. Unless you have a reason to use it, I would stick to REST.
Thrift
Thrift will create a client and a server stub, basically doing much of the work. The communication is in an efficient binary protocol. It’s gaining popularity in the Java world as it is used by many open source projects in the “Big Data” field. Examples, Cassandra, HBase (switching to Avro). Scrooge is a twitter project to create idiomatic thrift stubs for scala.
Akka actors
Akka is framework that implements the Actor model for Scala and Java. Includes provisions for inter-service communication, and takes care of many of the details under the hood. I
Depending on your needs, some will be more suitable than others.