Подтвердить что ты не робот

Unserialize в Java - сериализованный php-объект

Кто-нибудь знает, возможно ли, на самом деле, если это было сделано, сериализовать объект в php и неэриализовать его в Java (java-php-связь). Возможно, потребуется адаптер.

Как вы думаете?

Спасибо

4b9b3361

Ответ 1

Существует serialized-php-parser, который представляет собой реализацию Java, которая может анализировать объекты, сериализованные php. В общем, если у вас есть выбор, я бы не рекомендовал php-сериализован как формат обмена, потому что он не является ascii-safe (он содержит null-байты). Идите в таком формате, как xml или json. Если вам нужна информация о типе, xmlrpc - хороший выбор. Он имеет хорошие реализации как для php, так и для Java.

Ответ 2

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

Двумя наиболее очевидными примерами являются XML и JSON.

Существуют и другие, такие как буферы протокола Google.

Ответ 3

Еще один проект Java для работы с форматом сериализации PHP - Pherialize.

Скажем, вы сериализуете массив следующим образом:

array(3) {
  [0]=>
  string(8) "A string"
  [1]=>
  int(12345)
  [2]=>
  bool(true)
}

Затем вы можете неэриализовать его в Java с помощью Pherialize следующим образом:

MixedArray list = Pherialize.unserialize(data).toArray();
System.out.println("Item 1: " + list.getString(0));
System.out.println("Item 2: " + list.getInteger(1));
System.out.println("Item 3: " + list.getBoolean(2));

Ответ 4

Теоретически это возможно. В конце концов, это просто байты, и они могут быть проанализированы. Конечно, десериализованный объект будет содержать только данные, а не любые PHP-методы. Если вы этого хотите, вам придется переписать поведение как классы Java, которые напрямую соответствуют классам PHP.

На практике основная проблема заключается в том, что формат сериализации PHP формально не определен - по крайней мере, нет ссылки на спецификацию в руководство.

Поэтому вам, возможно, придется прорыть код, чтобы понять формат.

В целом, похоже, было бы намного проще и стабильнее использовать что-то вроде XML-сериализации - я уверен, что у обоих языков есть библиотеки, которые облегчают это.

Ответ 5

Формат JSON был бы хорошим местом для начала. Существуют реализации для Java, PHP и многие другие языки.

В то время как изначально на основе литеральной нотации объекта javascript, JSON оказался удобным для облегчения передачи данных между всеми типами систем.

Ответ 6

добавить в pom.xml

<dependency>
    <groupId>de.ailis.pherialize</groupId>
    <artifactId>pherialize</artifactId>
    <version>1.2.1</version>
</dependency>

затем в коде используйте

MixedArray list = Pherialize.unserialize(data).toArray(); // data is string `enter code here`

Ответ 7

Вы можете каким-то образом использовать PHP var_export() для этой функции, которая возвращает синтаксическое строковое представление объекта, который вы хотите сериализовать.

Ответ 8

Я помню фрагмент для Drupal (PHP CMS), где эта функция была необходима. Просто найдите его, поэтому взгляните на Serialized drupal node объекты на java (должен работать с любым сериализованным объектом PHP).

Может быть, вы можете это использовать. Я не знаю, есть ли проблемы с более новыми версиями PHP.

Ответ 9

Обратите внимание, что существует Java-реализация PHP. Таким образом, вы можете сериализовать объект и передать его на свой Java-PHP-экземпляр, десериализовать, а затем вызвать в свою инфраструктуру Java.

Все это звучит немного нечестивым беспорядком, но, возможно, стоит посмотреть!

Ответ 10

Попробуйте xstream (преобразует объекты Java в читаемый XML), чтобы сериализовать, а затем написать собственный PHP-код для десериализации.

Ответ 11

Используйте веб-службы (REST, RPC, SOAP) или любое другое решение, сохраняющее простой текст, который позволит вам читать/перестраивать данные с Java.

Ответ 12

Сериализация объекта в PHP сбрасывает свойства объекта. Полученная строка не очень сложна.

echo serialize(
    array(1, null, "mystring", array("key"=>"value"))
);

Результаты в:

a:4:{i:0;i:1;i:1;N;i:2;s:8:"mystring";i:3;a:1:{s:3:"key";s:5:"value";}}

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

Ответ 13

Вас также может заинтересовать использование моста PHP/Java (http://php-java-bridge.sourceforge.net/). Он имеет собственный протокол. На их сайте говорится, что это быстрое внедрение моста.

Ответ 14

Как и предыдущие ответы, я бы избегал сериализации объектов PHP, если это было возможно. Используйте JSON (который на самом деле быстрее, чем serialize() в PHP), бережливость или какой-то другой формат, который является более универсальным.

Если у вас нет выбора, я работаю над Jackson Module, чтобы включить чтение и запись сериализованного PHP с Java. Джексон - отличный синтаксический анализатор JSON, и поскольку формат сериализации PHP очень похож, он казался хорошим. Это еще не совсем завершено (письмо все еще продолжается).

Ответ 15

Лучше выбрать синтаксический анализ сериализованной строки PHP в JSONArray, это репо (https://github.com/superalsrk/PhpSerialization) может помочь вам