2009-04-04 6 views
5

Каков наилучший подход для сериализации графиков объектов Java?эффективная сериализация графа объектов Java

Мои требования к библиотеке сериализации являются 1) скорость десериализации 2) размер - как можно меньше (меньше, чем в Java по умолчанию сериализации) 3) гибкость - на основе аннотаций определения того, что должно быть сериализовать бы неплохо ,

Основной формат файла не имеет значения.

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

Любая помощь приветствуется.

+0

Сравнение виртуальной машины Java сериализаторов (https://github.com/eishay/jvm-serializers/wiki) имеет полезную информацию для выполнения, а также в результате размер сериализации. Он охватывает только один вариант использования (один тип сериализованного объекта), но дает некоторую идею. – StaxMan

ответ

1

Для сериализации Hessian является одним из самых эффективных.

Это примерно в 2-3 раза меньше и быстрее, чем Java Serialization, даже используя классы Externalizable.

Какую бы сериализацию вы ни использовали, вы можете использовать сжатие довольно легко, чтобы сделать данные более компактными.

Помимо этого вы можете написать свою собственную сериализацию. Я написал сериализатор, который пишет в/из ByteBuffer, который примерно в два раза быстрее и вдвое меньше размера Hessian (примерно в 5 раз быстрее/меньше, чем Java Serialization). Это может быть слишком много усилий для небольшого увеличения, если существующие сериализации сделают то, что вам нужно. Однако он такой же настраиваемый, как вам нравится;)

+0

Какой тип сериализатора вы пишете? Работает ли он для каких-либо объектов, или вам нужно написать специальный код сериализации для каждого класса? Разрешены ли ссылки на циклические объекты? –

+0

Это очень похоже на Гессиан. Он может сериализовать любой объект, кроме тех, которые моделируют реальные ресурсы за пределами Java, например, Threads, Sockets и т. Д. Вы пишете пользовательскую сериализацию, но поскольку она использует некоторое умное сжатие на лету, настраиваемые палатки для сериализации становятся медленнее! –

+0

«Разрешены ли ссылки на циклические объекты?» - Имейте версию с открытым исходным кодом, которая не поддерживает это, и я написал другую версию для работы, которая делает. ;) –

0

Я думаю, что сериализация Java по умолчанию будет довольно маленькой. Не можете ли вы ограничить то, что хотите сериализовать, с помощью ключевого слова transient? Это коснется вашей третьей проблемы (гибкость и аннотации)

+0

Сериализация по умолчанию обычно будет огромной для отдельных объектов.Это потому, что содержит все метаданные класса; для более крупных графиков объектов с несколькими экземплярами одинаковых типов это меньше проблема (только одно определение класса), но для отдельных объектов это, к сожалению, имеет большое значение. – StaxMan

2

Для небольших объектов в сериализованной форме Java, вероятно, будет доминировать описание сериализованных классов.

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

0

Будет http://jserial.sourceforge.net/ подходит под ваши нужды?

+0

Из их результатов тестов появляется десериализация «Bubble» * медленнее *, чем простая сериализация Java 1.4.2. –

+0

В двух тестах он медленнее, в других - быстрее. Это зависит от того, что сериализуется, и в любом случае 1.4.2 является древним, поэтому вы должны сравнить его с вашим собственным приложением и средой, чтобы убедиться, что он вам подходит. –

1

Во второй записке о полезности сжатия - все форматы сжимаются примерно до одного, т. Е. Больший выход сжимает больше.

Помимо этого и других рекомендаций, JSON с Jackson работает достаточно хорошо: намного быстрее, чем XML (конкурентоспособный с PB, Hessian) и бит более компактный; гораздо более гибкий, чем PB, легко интегрируется с JS на стороне клиента (если это имеет значение) и легко устраняется.

+0

Я второй это (JSON/Jackson)! См .: http://spring-java-ee.blogspot.com/2010/12/how-to-dumpinspect-object-or-variable.html –

0

Вы можете использовать Databoard для выполнения рекурсивной сериализации.

Это будет выглядеть примерно так ..

@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)); 
} 
Смежные вопросы