2009-04-04 19 views
5

Jakie jest najlepsze podejście do serializacji wykresów obiektów Java?wydajna seria serializacji obiektów java

Moje wymagania dla biblioteki serializacji są 1) prędkość deserializacji 2) Powierzchnia - możliwie małe (mniejsze niż w Javie domyślnej serializacji) 3) elastyczność - adnotacja na podstawie definicji, co należy odcinkach byłoby miło .

podstawowy format pliku nie jest ważny.

Przyjrzałem się buforom protokołów i XStream, ale ten pierwszy nie jest wystarczająco elastyczny ze względu na konieczność mapowania plików, a później tworzy duże pliki.

Każda pomoc doceniona.

+0

Porównanie serializers JVM (https://github.com/eishay/jvm-serializers/wiki) zawiera przydatne informacje dla wydajności, jak również wynikającą rozmiar serializacja. Obejmuje tylko jeden przypadek użycia (jeden typ serializowanego obiektu), ale daje pewien pomysł. – StaxMan

Odpowiedz

1

Do serializacji Hessian jest jednym z najbardziej wydajnych.

Jest to około 2-3 razy mniejszy i szybszy niż Serializacja Java, nawet przy użyciu klas Externalizable.

Niezależnie od używanej serializacji, można dość łatwo kompresować, aby dane były bardziej zwarte.

Poza tym możesz napisać własną serializację. Napisałem serializer, który zapisuje do/z ByteBuffer, który jest około dwa razy szybszy i o połowę mniejszy od Hesjan (około 5x szybszy/mniejszy niż Serializacja Java). Może to być zbyt wielki wysiłek dla małego zysku, jeśli istniejące serializacje zrobią to, czego potrzebujesz. Jest jednak tak konfigurowalny, jak lubisz;)

+0

Jakiego typu serializera napisałeś? Czy działa dla jakichkolwiek obiektów, czy też musisz napisać niestandardowy kod serializacji dla każdej klasy? Czy dozwolone są cykliczne odniesienia do obiektów? –

+0

To bardzo podobne do Hesji. Może serializować dowolny obiekt z wyjątkiem tych, które modelują rzeczywiste zasoby poza Javą, takie jak wątki, gniazda itp. Możesz napisać niestandardową serializację, ale ponieważ używa jakiejś inteligentnej kompresji w locie, niestandardowy namiot serializatorów jest wolniejszy! –

+0

"Czy dozwolone są odniesienia obiektów cyklicznych?" - Miej wersję o otwartym kodzie źródłowym, która tego nie obsługuje, a ja napisałem inną wersję do pracy, która ma. ;) –

0

Myślę, że domyślna serializacja Java będzie dość mała. Czy nie możesz w użyteczny sposób ograniczyć tego, co chcesz serializować, używając słowa kluczowego transient? To rozwiązałoby twój trzeci problem (elastyczność i adnotacje).

+0

Domyślna serializacja zazwyczaj będzie ogromna dla pojedynczych obiektów.To dlatego, że zawiera wszystkie metadane klasy; dla większych wykresów obiektów z wieloma instancjami tego samego typu jest to mniejszy problem (tylko jedna definicja klasy), ale dla pojedynczych obiektów jest niestety znaczący. – StaxMan

2

W przypadku małych obiektów, serializowana wersja Java prawdopodobnie będzie zdominowana przez opis klas zserializowanych.

Możliwe jest pisanie zserializowanych danych dla często używanych klas, a następnie używanie ich jako wspólnego prefiksu dla szeregu serializowanych strumieni. Zauważ, że jest to bardzo delikatne i prawdopodobnie będziesz chciał dokonać ponownego obliczenia i sprawdzić je dla każdej instancji modułu ładującego klasy.

0

Czy http://jserial.sourceforge.net/ będzie pasował do twoich potrzeb?

+0

Z ich wyników testów wynika, że ​​deserializacja "Bubble" jest * wolniejsza * niż zwykła serializacja Java 1.4.2. –

+0

W dwóch testach porównawczych jest wolniejszy, w innych jest szybszy. Zależy to od tego, co jest serializowane, a tak czy inaczej 1.4.2 jest starożytny, więc powinieneś porównać go z własną aplikacją i środowiskiem, aby sprawdzić, czy ci pasuje. –

1

Po drugie, uwaga o przydatności kompresji - wszystkie formaty kompresują do mniej więcej takie same, tj. Większa kompresja kompresuje więcej.

Poza tym i innymi zaleceniami, JSON z Jackson działa całkiem nieźle: znacznie szybciej niż XML (konkurencja z PB, Hessem) i nieco bardziej kompaktowy; znacznie bardziej elastyczny niż PB, łatwy do zintegrowania z JS po stronie klienta (jeśli to ma znaczenie) i łatwy do rozwiązywania problemów.

+0

Po drugie (JSON/Jackson)! Zobacz: http://spring-java-ee.blogspot.com/2010/12/how-to-dumpinspect-object-lub-variable.html –

0

Możesz użyć Databoard do serializacji rekursywnej.

To będzie wyglądać mniej więcej tak ..

@Referable class Node { 
    public int id; 
    public Node[] reference; 
    public Node(int id, Node...reference) { 
     this.id = id; 
     this.reference = reference; 
    } 

} 

public static void main(String[] args) throws Exception { 

    Node a = new Node(0); 
    Node b = new Node(1); 
    Node c = new Node(2); 
    a.reference = new Node[] {b, c}; 
    b.reference = new Node[] {a}; 
    c.reference = new Node[] {c}; 

    Binding binding = Bindings.getBinding(Node.class); 
    Serializer s = binding.serializer(); 
    byte[] data = s.serialize(a); 

    Node d = (Node) s.deserialize(data); 
    System.out.println(binding.toString(d)); 
}