Необходимость сериализации в Java

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

Обновить

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

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

  • Если вы хотите сохранить объект (-структуру) на диске, вам понадобится сериализация.
  • Webservice требует сериализации объектов в xml, прежде чем они могут быть переданы.

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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;
    }
}

Ответ 10

Сериализация: → Это процесс сохранения (или) записи состояния объекта в файл, называемый сериализацией.

и преобразование формы, поддерживаемой Java, в форму, поддерживаемую сетью, или в форму, поддерживаемую файлами. Используя FileOutputStream и ObjectOutputStream, мы можем добиться процесса сериализации.