Если вы собираетесь развернуть это в производственной среде, я бы посоветовал вам взглянуть на RMI или XML web services. (Google Protocol Buffers тоже интересны, но не содержат стандартного протокола для транспорта сообщений, хотя существуют 3rd party implementations).
Если вы делаете это ради удовольствия, есть много способов сделать это. В общем, сообщение в общей системе обмена сообщениями будет иметь какой-то «формат конверта», который содержит не только тело сообщения, но и метаданные о сообщении. Голый минимум для заголовка - это то, что идентифицирует предполагаемый получатель - либо целочисленный идентификатор, либо строку, представляющую имя метода, либо файл, или что-то в этом роде.
Простым примером является HTTP, формат в виде обычного текста, где конверт и составляются из всех строк до первой пустой строки. Первая строка идентифицирует версию протокола и предполагаемый приемник (≈ запрошенный файл), следующие строки являются метаданными о запросе, а тело сообщения следует за первой пустой строкой.
В общем, XML является распространенным форматом для распределенных служб (в основном из-за его хороших возможностей схемы и межплатформенной поддержки), хотя некоторые схемы используют другие форматы для простоты и/или производительности. Например, RMI использует стандартную сериализацию объектов Java.
Что вы решите использовать, в конечном итоге зависит от ваших потребностей. Если вы хотите упростить взаимодействие с вашей системой с большого количества платформ, используйте веб-службы XML (или REST). Для связи между распределенными подсистемами Java используйте RMI. Если ваша система чрезвычайно полезна для транзакций, возможно, пользовательский двоичный формат лучше всего подходит для более быстрой обработки и небольших сообщений. Но прежде чем делать эту «оптимизацию», помните, что для этого требуется лот больше работы, чтобы заставить ее работать исправно и что большинство приложения не получат от этого много пользы.