2012-09-16 22 views
6

Powiedzmy, że mam w pamięci tablicę arr obiektów typu A, z których każda ma pole odniesienia wskazujące na ten sam obiekt, B.Serializacja Java, Kryo i wykres obiektów

Ilustracja:

A_1 A_2 A_3 ... A_N 
| | |  | 
| | V  | 
\--->\--> B <-----/ 

Zauważ, że pole odniesienia w każdym obiekcie typu A wskazuje na samym obiektu typu B.

Teraz szereguję tablicę arr zawierającą obiekty typu A z ObjectOutputStream. Następnie deserializuję bajty uzyskane w ten sposób.

Otrzymuję nową tablicę arr1.

1) Czy tablica arr1 mieć obiektów typu A takie, że wszystkie wskazują na samym obiektu typu B? (Nie mam na myśli tego samego obiektu przed serializacją, ale unikatowym nowo utworzonym obiektem typu) 2) Innymi słowy, czy wywołanie serializacji/deserializacji w Javie zachowuje ten sam wykres obiektów, co przed serializacją? (tzn. nowo zserializowany wykres obiektów jest izomorficzny w stosunku do starego)

3) Gdzie jest to udokumentowane? (proszę podać cytat)

4) Te same pytania 1-3, ale zostały zastosowane do struktury serializacji Kryo dla języka Java.

Dziękuję.

Odpowiedz

9

http://docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html

Domyślny mechanizm serializacji dla obiektu pisze klasie obiekt, podpis klasy i wartości wszystkich pól non-nieustalonych i non-statyczne. Odwołania do innych obiektów (z wyjątkiem zmiennych przejściowych lub statycznych) ( ) powodują, że również te obiekty są zapisywane. Wiele odwołań do pojedynczego obiektu jest kodowanych przy użyciu mechanizmu udostępniania, który umożliwia odtworzenie wykresów obiektów o tym samym kształcie, co w przypadku oryginału.

chodzi o moje zrozumienie specyfikacji, można się wspólne odniesienia obiektu, jeśli instancje obiektów mają być dzielone odchodzenie bezpo¶rednio samego ObjectOutputStream.

Kiedy serializuje się klasę zawierającą tablicę , każdy zapisany obiekt otrzymuje identyfikator, a dla każdego odniesienia przechodzącego przez strumień zapisywany jest tylko ten identyfikator. W tym przypadku deserializowany wykres pozostaje jednorodny z oryginalnym wykresem.

Przykro mi, ale nie mogę pomóc w opracowaniu mechanizmu serializacji biblioteki w Krio, byłbym bardzo szczęśliwy, gdyby dowiedziałem się od kogoś, kto go używał.

EDIT o Kryo:

Niektóre dokumenty I znaleziono:

  • Domyślnie każdy występ obiektu na wykresie, po pierwsze jest przechowywany jako porządkowej całkowitej. Umożliwia to szeregowanie wielu odniesień do tego samego obiektu i cyklicznych wykresów. Ma to niewielki narzut i można go wyłączyć, aby zaoszczędzić miejsce, jeśli nie jest to konieczne: kryo.setReferences(false);

  • This (github) jest umową referenta referencyjnego; dwa realizacja podano: ArrayList oparte na małych obiektów wykresy, mapy oparte na większych

  • This jest realizacja układu domyślnego obiektu (de) serializer

  • Klasy muszą być zarejestrowane dla (de) serializacja; każdy zarejestrowany klasa może być sprzężony z serializatora (wśród których domyślnej Java serializacji mechanism)

+0

za pośrednictwem tego samego 'ObjectOutputStream' lub dodatkowo przez ten sam wezwaniem' metody writeObject'? – axel22

+2

Tylko przez ten sam strumień; pomyśl o dwóch obiektach, które się nawzajem odwołują. Piszesz pierwszy (a więc i odniesienie do drugiego) do strumienia. Gdy następnie napiszesz drugi do tego samego strumienia, który ma identyfikatory dla obu, odniesienia zostaną udostępnione. –

+0

Dzięki za wspaniałą odpowiedź! – axel22

Powiązane problemy