Deserialize на другом языке

голоса
5

Log4j сетевой адаптер отправляет события как упорядоченный объект Java. Я хотел бы быть в состоянии захватить этот объект и deserialise его на другом языке (Python). Это возможно?

Примечание Сети отлов легко; его просто TCP сокет и чтения в потоке. Трудность является deserialising часть

Задан 27/08/2008 в 05:18
источник пользователем
На других языках...                            


6 ответов

голоса
5

Как правило, нет.

Формат потока для Java сериализации определен в этом документе , но вы должны иметь доступ к исходным определениям классов (и выполнения Java , чтобы загрузить их в) , чтобы включить поток данных обратно в то приближающегося исходные объекты. Например, классы могут определять writeObject () и readObject () методы , чтобы настроить свою собственную последовательную форму.

( Редактирование: Любош hasko предлагает имея небольшую программу Java для десериализации объектов перед Python, но проблема заключается в том , что для этой работы, ваша «маленькая программа Java» необходима загрузить ту же версию всех те же классы , что может .. десериализации что сложно , если вы получаете сообщения журнала из одного приложения, и очень сложно , если вы мультиплексирование более чем один поток журнала в любом случае, это не будет маленькая программа больше. edit2: Я мог бы быть неправильно здесь, я не знаю , что получает сериализацию. Если это просто log4j классы вы должны быть хорошо. с другой стороны, можно войти произвольные исключения, и если они получают положенный в потоке, а моя точка стоит.)

Было бы гораздо легче настроить log4j сетевого адаптера и заменить сырую сериализацию с некоторой более легко десериализованной формой (например, вы могли бы использовать XStream превратить объект в представление XML)

Ответил 27/08/2008 d 05:35
источник пользователем

голоса
2

Теоретически , это возможно. Java сериализации, как и почти все в Javaland, стандартизирован. Таким образом, вы могли бы реализовать десериализатор в соответствии с этим стандартом в Python. Тем не менее, формат Java Сериализация не предназначен для использования межъязыковой, формат сериализации тесно связан с тем , как объекты представлены внутри виртуальной машины Java. Хотя реализация JVM в Python, безусловно , весело упражнения, вероятно , это не то , что вы ищете (-:

Есть и другие форматы (данные) сериализации, которые специально разработаны, чтобы быть независимыми от языков. Они обычно работают путем удаления форматов данных до минимума (числа, строки, последовательности, словарь, и это его), и, таким образом, требует немного работы на обоих концах представляют богатый объект в виде графика тупых структур данных (и вице- Versa).

Два примера JSON (JavaScript Object Notation) и YAML (YAML Не Markup Language) .

ASN.1 (Abstract Syntax Notation One) является другим форматом данных сериализации. Вместо того , чтобы dumbing формата вплоть до точки , где она может быть легко понять, является ASN.1 самоописываемым, то есть вся информация , необходимой для декодирования потока кодируется внутри самого потока.

И, конечно же, XML (Extensible Markup Language) , тоже будет работать, при условии , что она используется не только для обеспечения текстового представления «дамп памяти» объект Java, но фактическое абстрактное, от языка кодирования.

Таким образом, чтобы сделать длинную историю Короче говоря, вам лучше всего либо попытаться принудить log4j в лесозаготовки в одном из вышеупомянутых форматов, заменить log4j с чем-то, что делает это, или пытаться каким-то образом перехватывать объекты перед их отправкой над провода и преобразовать их, прежде чем покинуть Javaland.

Библиотеки, которые реализуют JSON, YAML, ASN.1 и XML доступны как для Java и Python (и почти каждый языка программирования известного человека).

Ответил 27/08/2008 d 06:05
источник пользователем

голоса
1

Ну я не эксперт Python, так что я не могу комментировать, как решить вашу проблему, но если у вас есть программы в .NET вы можете использовать ikvm.net для десериализации Java объектов легко. Я экспериментировал путем создания .NET клиента для сообщений журнала LOG4J написанных в гнездо Appender, и она работала очень хорошо.

Я извиняюсь, если этот ответ не имеет смысла здесь.

Ответил 27/08/2008 d 06:22
источник пользователем

голоса
1

Я рекомендовал бы двигаться в формате третьей стороной (путем создания собственных log4j адаптеров и т.д.), что оба языка понимают и могут легко мобилизовывать / распаковать, например, XML.

Ответил 27/08/2008 d 05:45
источник пользователем

голоса
1

Теоретически это возможно. Теперь , как трудно на практике это может быть , зависит от того, документированный формат сериализации Java или нет. Я думаю, это не так . Редактирование: упс, я был неправ, благодаря Чарльз .

Во всяком случае, это то, что я предлагаю вам сделать

  1. захват с log4j и десериализации объекта Java в своей собственной маленькой программе Java.

  2. Теперь, когда вы снова иметь объект, сериализовать его, используя свой собственный форматер.

    Совет: Может быть , вы даже не должны написать свой собственный форматер. например, в формате JSON (прокрутите вниз для LIBS) имеет библиотеки для Python и Java, так что вы могли бы теоретически использовать библиотеку Java для сериализации ваших объектов и Python эквивалент библиотеки для десериализации его

  3. послать выходной поток в приложение питона и десериализации его

Чарльз писал:

проблема заключается в том, что для этой работы, ваша «маленькая программа Java» необходимо загрузить те же версии все те же классы, что это может десериализации. Что сложно, если вы получаете сообщения журнала из одного приложения, и очень сложно, если вы мультиплексирование потока более чем один журнала. В любом случае, это не будет небольшая программа, больше.

Разве вы не просто ссылаться на библиотеки log4j Java в вашем собственном процессе Java? Я просто даю общие рекомендации здесь, что применимо к любой паре языков (название вопроса довольно язык агностик, так что я только при условии, один из общих решений). Во всяком случае, я не знаком с log4j и не знаю, можно ли «внедрить» свой собственный сериалайзер в него. Если вы можете, то, конечно, ваше предложение гораздо лучше и чище.

Ответил 27/08/2008 d 05:41
источник пользователем

голоса
0

Если вы можете иметь JVM на принимающей стороне и определении классов для сериализованных данных, и вы хотите использовать Python и никакого другого языка, то вы можете использовать Jython:

  • вы десериализации, что вы получили, используя правильные методы Java
  • а затем обработать то, что вы получаете с вами Python кода
Ответил 20/02/2009 d 18:34
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more