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