Необходимость сериализации в Java - PullRequest
52 голосов
/ 19 марта 2010

Может кто-нибудь сказать мне, что нужно для сериализации в Java и пример сценария, чтобы объяснить необходимость. Мне не нужно определение.

Ответы [ 8 ]

145 голосов
/ 12 июня 2011

Рассказ о сериализации

После многих лет напряженной работы ученые Земли разработали робота, который может помочь им в повседневной работе. Но у этого робота было меньше возможностей, чем у роботов, созданных учеными с планеты Марс.

После встречи ученых обеих планет было решено, что Марс отправит своих роботов на Землю. Но возникла проблема. Стоимость отправки 100 роботов на Землю составила 100 миллионов долларов. И это займет около 60 дней путешествия.

Наконец, ученые Мара решили поделиться своим секретом с учеными Земли. Этот секрет был о структуре класса / робота. Ученые Земли разработали такую ​​же структуру на самой Земле. Ученые Мара сериализовали данные каждого робота и отправляли их на Землю. Ученые Земли десериализовали данные и соответственно передали их каждому роботу.

Этот процесс сэкономил им время при передаче огромного количества данных.

Некоторые роботы использовались в некоторых оборонительных работах на Марсе. Поэтому их ученые отметили некоторые важные свойства этих роботов как переходный перед отправкой их данных на Землю. Обратите внимание, что для переходного свойства устанавливается значение null (в случае ссылки) или значение по умолчанию (в случае типа примитива), когда объект десериализован.

Еще один момент, замеченный учеными Земли, заключается в том, что ученые Марса попросили их создать статические переменные , чтобы хранить подробности об окружающей среде. Эти детали используются некоторыми роботами. Но ученые Марса не разделяют эти детали. Потому что среда Земли отличалась от среды Марса.

Даже зная о структуре классов роботов и имея сериализованные данные, ученые Земли не смогли десериализовать данные, которые могут заставить роботов работать.

Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
:

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

Обновление

Хотя с помощью сериализации они смогли отправлять данные, используя сигналы вместо реального космического корабля, они поняли, что отправка большого набора данных все еще остается проблемой. Сериализация делает процесс более дешевым и быстрым, но все еще медленным. Поэтому разные ученые выдвинули разные идеи по уменьшению размера данных. Некоторые ученые предложили сжать данные, а некоторые предложили использовать другой механизм для их представления, чтобы их можно было десериализовать обратно. Некоторые из идей: XML , JSON , msgpack , निम्न (Nimn)

120 голосов
/ 19 марта 2010

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

Теперь проблема в том, что ваша сетевая инфраструктура и ваш жесткий диск - это аппаратные компоненты, которые понимают биты и байты, но не объекты JAVA.

Сериализация - это перевод значений / состояний вашего Java-объекта в байты для его отправки по сети или сохранения.

Это аналогично тому, как ваш голос передается по телефонным линиям КТСОП.

35 голосов
/ 19 марта 2010

Java-сериализация (и, в частности, Serializable и Exernalizable интерфейсы) позволяет читать / записывать произвольно сложные объекты Java, автоматически или вручную с / на диск или с / на сеть. В то время как XML и JSON являются текстовыми форматами, Java-сериализация является двоичным форматом. (Сериализация также является общей концепцией простого чтения / записи данных, но поскольку вопрос касается Java, я предполагаю, что вы имеете в виду встроенную систему сериализации, т.е. Serializable / Exernalizable)

Преимущества "реализует Сериализуемый" перед XML / JSON
Сначала вы получаете сериализацию практически бесплатно. Вам не нужно вносить очень много изменений в свои объекты, чтобы механизм сериализации работал с ним. Другое преимущество состоит в том, что, поскольку это двоичный формат, он намного более компактен, чем текстовый формат, и поэтому, вероятно, будет использовать меньше места (что хорошо для сохранения пропускной способности сети или для сохранения места на диске).

Недостатки "реализует Сериализуемый" перед XML / JSON
Недостаток встроенной сериализации Java заключается в том, что если вы вносите изменения в свой объект, совместимость различных форматов сериализации может стать настоящим кошмаром. Кроме того, в то время как вы можете вручную редактировать XML и JSON, вы не можете редактировать сериализованный объект Java (без чтения его в Java). По тем же причинам зачастую проще отлаживать XML и JSON, чем двоичные форматы, поскольку XML и JSON удобочитаемы для человека. Еще один недостаток встроенного механизма Java-сериализации в том, что вы не можете (легко) сериализовать / десериализовать данные из другого языка программирования.

Альтернативные методы чтения / записи данных
Существуют альтернативные методы сериализации, отличные от встроенной сериализации Java, которые дают вам лучшее из обоих миров: компактные двоичные форматы, взаимодействие языков, простота совместимости версий, а также часто инструменты отладки, которые облегчают вывод двоичных данных в читаемый формат. Например, буферы протокола с открытым исходным кодом Google и MessagePack представляют собой примеры библиотек / форматов сериализации, которые позволяют вам читать / записывать компактные двоичные данные и легко поддерживать совместимость версий. Самым большим недостатком этих библиотек по сравнению со встроенной сериализацией Java является то, что они включают в себя простые объекты старых данных для сериализации (в отличие от более полнофункциональных объектов Java, с которыми также связано поведение); однако этот недостаток, по сути, является преимуществом, поскольку отделение модели данных, в которой / из которой хранится информация, от объектов, которые обертывают или получают из них, на самом деле является хорошей практикой программирования и облегчает поддержку нескольких форматов.

Использование
Поскольку вы спрашивали о необходимости, а не просто об определении, существует несколько вариантов использования:

  1. Просто сохраните ваши данные для последующего использования. Например, допустим, вы пишете видеоигру. Ваша программа не будет работать вечно; даже если он никогда не выйдет из строя (что, как мы надеемся), в какой-то момент ваш пользователь, вероятно, выйдет из программы, или операционная система может убить программу, чтобы сэкономить ресурсы (например, в Android, часто происходят фоновые процессы, с которыми пользователь не взаимодействует). и намеренно убит ОС для восстановления системных ресурсов, таких как ОЗУ). Чтобы гарантировать, что пользователь не запускается с самого начала и может вместо этого возобновить с того места, где он находился, или с самой последней точки сохранения, вы захотите записать состояние игры в постоянное хранилище (то есть на жесткий диск, учетная запись пользователя Google Drive и т. д.). Для этого вам необходимо преобразовать структуры данных в памяти, которые представляют состояние игры, в необработанные байты, которые вы можете записать на диск (или в любую систему, в которой вы сохраняете данные).

  2. Получение информации с удаленного сервера.Давайте продолжим с примером игры ... предположим, что вы создаете многопользовательскую онлайн-игру или хотите, чтобы в игре можно было добавлять новые уровни или предметы без обновления пользователем своего приложения.Для этого вы хотите, чтобы информация об онлайн-плеере или информация о новых уровнях / элементах передавалась с серверного компьютера (который вы используете в качестве точки контакта для всех копий приложения, установленных на различных устройствах)к отдельным копиям приложения.Как серверу, так и приложению требуется своего рода представление этих структур данных в памяти (например, местоположение других игроков, структура нового уровня, описание / изображение для нового элемента и т. Д.), Но для передачи информацииот сервера до приложения на устройстве, система связи состоит из необработанных байтов, поэтому необходимо иметь способ преобразования данных в необработанные байты и из необработанных байтов обратно в значимую структуру данных в памяти.

Практически любой обмен данными между двумя различными процессами / приложениями или между приложением и некоторой системой хранения - это случай, когда требуется какой-то механизм сериализации.

13 голосов
/ 19 марта 2010

Если вы хотите сохранить состояние объекта в файл или отправить его по сети, вам необходимо преобразовать его в последовательность байтов. Это называется сериализацией.

В Java есть встроенный механизм для этого, другие опции включают XML или JSON.

Примеры, когда это необходимо: кэширование объектов, выполнение удаленных вызовов методов, сохранение графа объектов на диск.

3 голосов
/ 19 марта 2010
  • Если вы хотите сохранить объект (-структуру) на диске, вам потребуется сериализация.
  • Веб-сервис требует сериализации объектов в XML, прежде чем они могут быть переданы.
2 голосов
/ 03 июля 2014

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

2 голосов
/ 21 июля 2012

И вы также можете реализовать клонирование объектов, используя сериализацию

0 голосов
/ 06 февраля 2019
public class Serializer {

    public static void write(Object o, File f) throws IOException {
        f.delete();
        f.createNewFile();
        FileOutputStream fileOut = new FileOutputStream(f);
        ObjectOutputStream out = new ObjectOutputStream(fileOut);
        out.writeObject(o);
        out.close();
        fileOut.close();
    }

    public static Object read(File f) throws Exception{
        FileInputStream fileIn = new FileInputStream(f);
        ObjectInputStream in = new ObjectInputStream(fileIn);
        Object e = in.readObject();
        in.close();
        fileIn.close();
        return e;
    }

    public static byte[] toBytes(Object o) {
        byte[] bytes = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = null;
        try {
            out = new ObjectOutputStream(bos);
            out.writeObject(o);
            out.flush();
            bytes = bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bos.close();
            } catch (IOException ex) {
                // ignore close exception
            }
        }

        return bytes;
    }

    public static Object fromBytes(byte[] bytes) {
        Object o = null;
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        ObjectInput in = null;
        try {
            in = new ObjectInputStream(bis);
            o = in.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                // ignore close exception
            }
        }

        return o;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...