2009-04-13 11 views

Odpowiedz

4

Teoretycznie jest to oczywiście możliwe. W końcu to tylko bajty i można je przeanalizować. Oczywiście, obiekt deserializacyjny zawierałby tylko dane, a nie żadne metody PHP. Jeśli chcesz, musisz przepisać zachowanie jako klasy Java, które odpowiadają bezpośrednio klasom PHP.

W praktyce głównym problemem wydaje się być fakt, że format serializacji PHP nie jest formalnie określony - przynajmniej nie ma linku do specyfikacji w the manual.

Być może trzeba będzie przekopać kod, aby zrozumieć format.

Podsumowując, wydaje się, że byłoby znacznie łatwiej i bardziej stabilnie korzystać z serializacji XML - jestem pewien, że oba języki mają do tego odpowiednie biblioteki.

0

Pamiętaj, że istnieje Java implementation of PHP. Więc możesz może być w stanie serializować obiekt i przekazać go do twojej instancji Java-PHP, deserialise, a następnie wywołać do swojej infrastruktury Java.

Wszystko to brzmi trochę bezbożnie, ale być może warto na niego patrzeć!

2

Możesz w jakiś sposób skorzystać z funkcji PHP var_export() dla tego, która zwraca parseable ciąg znaków reprezentujący obiekt, który chcesz serializować.

14

PHP i Java używają własnych (oczywiście różnych) schematów serializacji. Można jednak użyć formatu wymiany zarówno do odczytu, jak i zapisu.

Dwa najbardziej oczywiste przykłady to XML i JSON.

Istnieją jednak inne, takie jak bufory protokołu Google.

0

Wypróbuj xstream (przekształca obiekty Java w czytelny XML), aby serializować, a następnie napisać własny kod PHP w celu deserializacji.

0

Skorzystaj z usług sieci Web (REST, RPC, SOAP) lub dowolnego innego rozwiązania przechowującego zwykły tekst, który umożliwi odczytanie/przebudowanie danych z języka Java.

1

Pamiętam fragment kodu Drupala (PHP CMS), w którym potrzebna była ta funkcja. Po prostu go znalazłem, więc spójrz na Serialized drupal node objects to java (powinno działać z dowolnym serializowanym obiektem PHP).

Może możesz tego użyć. Nie wiem, czy są problemy z nowszymi wersjami PHP.

3

Format JSON byłby dobrym miejscem do rozpoczęcia. Istnieją implementacje dla Java, PHP i wielu innych języków.

Początkowo bazując na notacji literackiej obiektu javascript, JSON okazał się wygodny do lekkiego transferu danych między wszystkimi typami systemów.

+0

Oczywiście, ale działa dobrze na przesyłanie typów pierwotnych i jest obsługiwany przez większość języków. – Matt

+0

json.org wymienia 35 języków, które mają implementacje, więc powiedziałbym, że nie jest przeznaczone wyłącznie dla Javascript. – zimbu668

0

Serializowanie obiektu w PHP spowoduje zrzucenie właściwości obiektu. Wynikowy ciąg nie jest strasznie skomplikowany.

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

Wyniki w:

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

Łańcuch identyfikuje typy danych, długości tablicy, indeksów tablicy i wartości, długości ciągów ... nie zajmie zbyt wiele wysiłku, aby odwrócić inżynier go i wymyślić z twoim własnym parserem, tak myślę.

16

Istnieje serialized-php-parser, która jest implementacją Java, która może analizować obiekty serializowane w PHP. Ogólnie rzecz biorąc, jeśli masz wybór, nie poleciłbym php-serialized jako formatu wymiany, ponieważ nie jest on ascii-safe (Zawiera null-bytes). Idź z formatem takim jak xml lub json. Jeśli potrzebujesz trochę informacji o typie, dobrym wyborem jest xmlrpc. Ma dobre implementacje dla php i Java.

7

Innym projektem Java do pracy z formatowaniem serializacji PHP jest Pherialize.

Powiedzmy, że są szeregowania tablicę takiego:

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

Następnie można unserialize go w Javie z Pherialize tak:

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

Podobnie jak w poprzednich odpowiedziach wspomniałem, chciałbym uniknąć PHP serializacja obiektów, jeśli to możliwe. Użyj JSON (który jest rzeczywiście szybszy niż serialize() w PHP), oszczędność lub inny format, który jest bardziej uniwersalny.

Jeśli nie masz wyboru, pracowałem nad Jackson Module, aby umożliwić czytanie i pisanie serializowanego PHP z Java. Jackson jest świetnym parserem JSON, a ponieważ format serializacji PHP jest dość podobny, wydawało się, że jest dobrze dopasowany. Nie jest jeszcze kompletny (pisanie wciąż trwa).

3

dodać do pom.xml

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

następnie w użyciu kodu

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