Десериализуйте на другом языке

public static void RegisterTypes(IUnityContainer container)
{
   container.RegisterType(typeof(IEmployee<>), typeof(Employee<>), new TransientLifetimeManager());
}
5
задан Doug Miller 27 August 2008 в 04:18
поделиться

6 ответов

Обычно нет.

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

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

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

5
ответ дан 13 December 2019 в 22:20
поделиться

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

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

Двумя примерами является JSON (Объектная нотация JavaScript), и YAML (YAML не Является Языком разметки).

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

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

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

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

2
ответ дан 13 December 2019 в 22:20
поделиться

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

1
ответ дан 13 December 2019 в 22:20
поделиться

Хорошо я не эксперт Python, таким образом, я не могу прокомментировать, как решить Вашу проблему, но если у Вас есть программа в.NET, можно использовать IKVM.NET для десериализации объектов Java легко. Я экспериментировал, это путем создания Клиента.NET для журнала Log4J обменивается сообщениями записанный для Снабжения appender сокетом, и он работал действительно хорошо.

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

1
ответ дан 13 December 2019 в 22:20
поделиться

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

Так или иначе это - то, что я предлагаю, чтобы Вы сделали

  1. получение от log4j и десериализовывает объект Java в Вашей собственной небольшой программе Java.

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

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

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

Charles записал:

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

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

1
ответ дан 13 December 2019 в 22:20
поделиться

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

  • Вы десериализовали бы то, что Вы получили использование корректных методов Java
  • и затем Вы обрабатываете то, что Вы получаете с Вами код Python
0
ответ дан 13 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: