jInterface для создания внешнего термина Erlang

Как я могу отформатировать следующий термин erlang:

{ atom, "message" }

В jInterface к внешнему формату, который я могу вызвать в оболочке erlang

erlang:binary_to_term( Binary )

Пример: обратите внимание, что, поскольку кортеж будет отправлен по сети, я заканчиваю преобразованием в byte[].

OtpErlangObject[] msg = new OtpErlangObject[2];
msg[0] = new OtpErlangAtom( "atom" );
msg[1] = new OtpErlangString( "message" );

OtpErlangTuple reply = new OtpErlangTuple(msg);

OtpOutputStream stream = new OtpOutputStream(reply);

stream.toByteArray()    // byte[] which I send over net

Двоичный файл, полученный Erlang:

B = <<104,2,100,0,4,97,116,111,109,107,0,7,109,101,115,115,97,103,101>>

Затем в оболочке erlang преобразование полученного члена в двоичное дает бадарг.

 binary_to_term( B ).                                                     
** exception error: bad argument
     in function  binary_to_term/1
        called as binary_to_term(<<104,2,107,0,4,97,116,111,109,107,0,7,109,
                                   101,115,115,97,103,101>>)

2 ответа

Решение
binary_to_term( <<131,104,2,107,0,4,97,116,111,109,107,0,7,109,101,115,115,97,103,101>> ).
{"atom","message"}

Кажется, что в сообщении отсутствует тег 131, требуемый term_to_binary. Как видно из вывода Java, этот тег не добавляется при кодировании jinterface. Если я просто добавлю 131 в начало двоичного файла, он будет правильно декодирован.

Теперь, почему Java не добавляет его?

Я все равно приму ответы, так как я официально не ответил на мой вопрос (поддерживаемым способом, т.е. не взломав 131)

Ref:

http://www.erlang.org/doc/apps/erts/erl_ext_dist.html

Я не проверял это, но если вы кодируете {atom, "message"}Разве вы не должны посылать через кортеж, а не 2 объекта один за другим? Попробуйте создать объект Tuple и добавить atom а также message как элементы.

Другие вопросы по тегам