2009-04-13 6 views

Antwort

4

Theoretisch ist es sicherlich möglich. Es ist nur Bytes nach allem, und sie können analysiert werden. Natürlich würde das deserialisierte Objekt nur Daten enthalten, keine der PHP-Methoden. Wenn Sie das möchten, müssten Sie das Verhalten als Java-Klassen neu schreiben, die direkt mit den PHP-Klassen korrespondieren.

In der Praxis scheint das Hauptproblem darin zu liegen, dass das PHP-Serialisierungsformat anscheinend nicht formal spezifiziert ist - zumindest gibt es keine Verbindung zu einer Spezifikation in the manual.

Also müssen Sie vielleicht durch den Code graben, um das Format zu verstehen.

Alles in allem klingt es wie es viel einfacher und stabiler wäre, etwas wie XML-Serialisierung zu verwenden - ich bin sicher, dass beide Sprachen Bibliotheken haben, die dies erleichtern.

0

Beachten Sie, dass es eine Java implementation of PHP gibt. So können Sie in der Lage sein, das Objekt serialisieren und es an Ihre Java-PHP-Instanz übergeben, deserialisieren und dann in Ihre Java-Infrastruktur aufrufen.

Es klingt alles ein bisschen unheilig, aber vielleicht sehenswert!

2

Sie können dafür die Funktion var_export() von PHP verwenden, die eine analysierbare Zeichenfolgendarstellung des Objekts zurückgibt, das Sie serialisieren möchten.

14

PHP und Java verwenden beide ihre eigenen (offensichtlich unterschiedliche) Serialisierungsschemata. Sie könnten jedoch ein Austauschformat verwenden, das sowohl lesen als auch schreiben kann.

Die zwei offensichtlichsten Beispiele sind XML und JSON.

Es gibt jedoch andere wie Google Protocol Buffers.

0

Versuchen Sie xstream (konvertiert Java-Objekte in lesbare XML) zu serialisieren und dann schreiben Sie Ihren eigenen PHP-Code zu deserialisieren.

0

Verwenden Sie Webdienste (REST, RPC, SOAP) oder eine andere Lösung, die reinen Text speichert, mit dem Sie die Daten aus Java lesen/wiederherstellen können.

1

Ich erinnere mich an einen Ausschnitt für Drupal (PHP CMS), wo diese Funktionalität benötigt wurde. Finden Sie es einfach, also schauen Sie sich Serialized drupal node objects to java an (sollte mit jedem serialisierten PHP-Objekt funktionieren).

Vielleicht können Sie das verwenden. Ich weiß nicht, ob es Probleme mit neueren PHP-Versionen gibt.

3

Das JSON Format wäre ein guter Anfang. Es gibt Implementierungen für Java, PHP und viele andere Sprachen.

Während anfänglich auf der Javascript-Objekt-Literal Notation, JSON erwies sich als bequem für leichte Datenübertragung zwischen allen Arten von Systemen.

+0

Sicher, aber es funktioniert gut, um primitive Typen zu übertragen und wird von den meisten Sprachen gut unterstützt. – Matt

+0

json.org listet 35 Sprachen auf, die Implementierungen haben, also würde ich sagen, es ist nicht ausschließlich für Javascript gedacht. – zimbu668

0

Durch Serialisierung eines Objekts in PHP werden die Objekteigenschaften ausgegeben. Die resultierende Zeichenfolge ist nicht besonders kompliziert.

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

Ergebnisse in:

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

Der String-Datentypen identifiziert, Array Längen, Array-Indizes und Werte, String-Längen ... Würde zu viel Aufwand nicht, um es Reverse-Engineering und kommen mit deinem eigenen Parser, denke ich.

16

Es gibt serialized-php-parser, eine Java-Implementierung, die php-serialisierte Objekte parsen kann. Im Allgemeinen, wenn Sie die Wahl haben, würde ich php-serialized nicht als ein Austauschformat empfehlen, weil es nicht ascii-safe ist (Es enthält null-Bytes). Verwenden Sie stattdessen ein Format wie xml oder json. Wenn Sie ein bisschen Typinformation benötigen, ist xmlrpc eine gute Wahl. Es hat gute Implementierungen für PHP und Java.

7

Ein anderes Java-Projekt, das mit dem PHP-Serialisierungsformat arbeitet, ist Pherialize.

Angenommen, Sie haben ein Array wie diese sind Serialisierung:

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

Dann können Sie es in Java mit Pherialize wie diese unserialize:

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)); 
0

Wie frühere Antworten erwähnt haben, würde ich PHP vermeiden Objektserialisierung wenn möglich Verwenden Sie JSON (das ist in PHP tatsächlich schneller als serialize()), Sparsamkeit oder ein anderes Format, das universeller ist.

Wenn Sie keine andere Wahl haben, habe ich an einem Jackson Module gearbeitet, um das Lesen und Schreiben von serialisiertem PHP aus Java zu ermöglichen. Jackson ist ein großartiger JSON-Parser, und da das PHP-Serialisierungsformat ziemlich ähnlich ist, schien es gut zu passen. Es ist noch nicht vollständig (das Schreiben ist noch in Arbeit).

3

hinzufügen in pom.xml

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

dann in Code verwenden

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