2016-04-28 2 views
1

Скажем, у меня большой файл со многими объектами, которые уже сериализованы (это легкая часть). Я должен иметь возможность иметь произвольный доступ к объектам в файле, когда я перехожу к десериализации. Единственный способ, которым я могу это сделать, - это как-то сохранить указатель на каждый объект.Deserializing Objects в Java

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

Может ли кто-нибудь указать мне в правильном направлении на этом?

+0

Как насчет использования какого-либо объекта DB? Что-то вроде [Neodatis] (http://neodatis.wikidot.com/) (есть много других, см. Эту страницу [wikipedia] (https://en.wikipedia.org/wiki/Comparison_of_object_database_management_systems)) –

+0

Что делать, если вы сериализуете объект в структуру каталогов с файлом поиска на верхнем уровне каталога. Каждый раз, когда вам нужен объект, вы разбираете файл поиска, а затем берете файл, необходимый для конкретного объекта. Просто мысль. –

+0

Я пытаюсь сохранить skiplist в файле ... так что мне нужно сериализовать и deserialze Пропустить узлы. Есть ли способ, с помощью которого skiplist позволяет мне получить доступ к узлам, которые мне нужны? Я чувствую, что мне все еще нужен указатель на файл, чтобы получить правильный объект. –

ответ

1

Вы не можете. Сериализация называется сериализацией по какой-либо причине. Он серийный. Случайный доступ к потоку объектов не будет работать по нескольким причинам, включая заголовок потока, дескрипторы объектов, ...

+0

Почему бы не сохранить указатель на файл, где будет работать объект? Я думаю, это то, что мы должны делать ... используйте дескриптор, чтобы сохранить начальную позицию и длину, а затем десериализовать. Будет ли это работать? –

+0

@LoganM Поскольку ранее сериализованные объекты не были повторно сериализованы. Если объект содержит член, который уже был сериализован в потоке, он не повторно сериализуется. Поэтому правильная десериализация этого объекта зависит от чтения всего потока до этой точки. – EJP

0

Прямая сериализация никогда не будет решением, которое вы хотите. Часть названия означает, что объекты записываются линейно на ObjectOutputStream.

Формат сериализации хорошо известен, здесь link в формате сериализации java 6.

У вас есть несколько вариантов:

  1. десериализируются весь файл и идти оттуда.
  2. Запишите код, чтобы прочитать сериализованный файл и сгенерировать индекс. Возможно, даже сохраните индекс в файле для дальнейшего использования.
  3. Отказаться от сериализации в файл и сохранить объекты в базе данных.
+0

Индекс не будет работать. Весь поток должен быть прочитан до той точки, где нужен требуемый объект. – EJP