2008-08-27 5 views
5

Сетевой адаптер log4j отправляет события как сериализованный Java-объект. Я хотел бы иметь возможность захватить этот объект и десериализировать его на другом языке (python). Это возможно?Deserialize на другом языке

ПРИМЕЧАНИЕ Съемка сети проста; его просто сокет TCP и чтение в потоке. Трудность заключается в десериализационной части

ответ

5

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

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

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

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

+0

сериализации спецификации связи в настоящее время приводит к общей странице. Я думаю, что это правильная ссылка: https://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html – nacho4d 2016-09-09 05:58:18

1

Теоретически это возможно. Теперь, насколько сложно на практике это зависит, зависит от того, документирован ли формат сериализации Java или нет. Наверное, это не так. Редактировать:oops, I was wrong, thanks Charles.

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

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

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

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

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

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

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

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

1

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

+0

JSON тоже будет работать. – 2009-01-08 20:59:16

2

Теоретически, это возможно. Сериализация Java, как и почти все в Джаваландии, стандартизирована. Итак, вы можете реализовать десериализатор в соответствии с этим стандартом в Python. Однако формат Java Serialization не предназначен для использования на разных языках, формат сериализации тесно связан с тем, как объекты отображаются внутри JVM. Хотя реализация JVM в Python - это забавное упражнение, это, вероятно, не то, что вы ищете (-:

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

два примера JSON (JavaScript Object Notation) и YAML (YAML Ain't Markup Language).

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

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

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

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

1

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

Прошу прощения, если этот ответ здесь не имеет смысла.

0

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

  • вы десериализацию что вы получили, используя правильные методы Java
  • , а затем вы обрабатываете, что вы получаете с вами кода Python

 Смежные вопросы

  • Нет связанных вопросов^_^