Что такое сериализация объектов? - PullRequest
357 голосов
/ 15 января 2009

Что подразумевается под «сериализацией объекта»? Можете ли вы объяснить это с некоторыми примерами?

Ответы [ 13 ]

380 голосов
/ 15 января 2009

Сериализация может рассматриваться как процесс преобразования экземпляра объекта в последовательность байтов (которая может быть двоичной или не зависящей от реализации).

Это очень полезно, когда вы хотите передать данные одного объекта по сети, например, от одной JVM к другой.

В Java механизм сериализации встроен в платформу, но вам нужно реализовать интерфейс Serializable , чтобы сериализовать объект.

Вы также можете предотвратить сериализацию некоторых данных в вашем объекте, пометив атрибут как transient .

Наконец, вы можете переопределить механизм по умолчанию и предоставить свой собственный; это может подойти в некоторых особых случаях. Для этого вы используете одну из скрытых функций в java .

Важно отметить, что сериализуемым является «значение» объекта или содержимого, а не определение класса. Таким образом, методы не сериализуются.

Вот очень простой пример с комментариями, облегчающими его чтение:

import java.io.*;
import java.util.*;

// This class implements "Serializable" to let the system know
// it's ok to do it. You as programmer are aware of that.
public class SerializationSample implements Serializable {

    // These attributes conform the "value" of the object.

    // These two will be serialized;
    private String aString = "The value of that string";
    private int    someInteger = 0;

    // But this won't since it is marked as transient.
    private transient List<File> unInterestingLongLongList;

    // Main method to test.
    public static void main( String [] args ) throws IOException  { 

        // Create a sample object, that contains the default values.
        SerializationSample instance = new SerializationSample();

        // The "ObjectOutputStream" class has the default 
        // definition to serialize an object.
        ObjectOutputStream oos = new ObjectOutputStream( 
                               // By using "FileOutputStream" we will 
                               // Write it to a File in the file system
                               // It could have been a Socket to another 
                               // machine, a database, an in memory array, etc.
                               new FileOutputStream(new File("o.ser")));

        // do the magic  
        oos.writeObject( instance );
        // close the writing.
        oos.close();
    }
}

Когда мы запускаем эту программу, создается файл «o.ser», и мы видим, что произошло позади.

Если мы изменим значение: someInteger , например, Integer.MAX_VALUE , мы можем сравнить вывод, чтобы увидеть, в чем разница.

Вот скриншот, показывающий именно эту разницу:

alt text

Можете ли вы определить разницу? ;)

В сериализации Java есть еще одно релевантное поле: serialversionUID , но, думаю, это уже слишком долго, чтобы его охватить.

375 голосов
/ 15 января 2009

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

85 голосов
/ 17 сентября 2015

Смел ответить на 6-летний вопрос, добавив только очень высокий уровень понимания для людей, плохо знакомых с Java

Что такое сериализация?

Преобразование объекта в байты и байты обратно в объект (десериализация).

когда используется сериализация?

Когда мы хотим сохранить объект. Когда мы хотим, чтобы объект существовал вне времени жизни JVM.

Пример из реального мира:

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

Как выполняется сериализация в Java.

  1. Реализация java.io.Serializable интерфейса (маркерный интерфейс, поэтому нет способа реализовать).

  2. Сохранение объекта: используйте класс java.io.ObjectOutputStream, поток фильтра, который является оберткой вокруг потока байтов более низкого уровня (для записи объекта в файловые системы или передачи сплющенного объекта по сетевому проводу и восстановления на другая сторона).

    • writeObject(<<instance>>) - для записи объекта
    • readObject() - для чтения сериализованного объекта

Помните:

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

Когда вы сериализовали 2-байтовый объект, вы видите 51-байтовый сериализованный файл.

Шаги по сериализации и десериализации объекта.

Ответ за: Как конвертировать файл в 51 байт?

  • Сначала записываются магические данные потока сериализации (STREAM_MAGIC = "AC ED" и STREAM_VERSION = версия JVM).
  • Затем записываются метаданные класса, связанного с экземпляром (длина класса, имя класса, serialVersionUID).
  • Затем он рекурсивно записывает метаданные суперкласса, пока не найдет java.lang.Object.
  • Затем начинается с фактических данных, связанных с экземпляром.
  • Наконец записывает данные объектов, связанных с экземпляром, начиная с метаданных, до фактического содержимого.

Если вы заинтересованы в дополнительной информации о сериализации Java, пожалуйста, проверьте эту ссылку .

Редактировать : Еще одна хорошая ссылка для чтения.

Это ответит на несколько частых вопросов:

  1. Как не сериализовать поля в классе.
    Ответ: используйте временное ключевое слово

  2. Когда сериализуется дочерний класс, сериализуется ли родительский класс?
    Ответ: Нет, если родитель не расширяет поле родителей интерфейса Serializable, не сериализуется.

  3. При сериализации родительского класса сериализуется ли дочерний класс?
    Ответ: Да, по умолчанию дочерний класс также сериализуется.

  4. Как предотвратить сериализацию дочернего класса?
    Ответ: а. Переопределите метод writeObject и readObject и бросьте NotSerializableException.

    б. также вы можете отметить все переходные поля в дочернем классе.

  5. Некоторые классы системного уровня, такие как Thread, OutputStream и его подклассы и Socket, не сериализуемы.
19 голосов
/ 15 января 2009

Сериализация берет «живой» объект в памяти и преобразовывает его в формат, который может быть сохранен где-то (например, в памяти, на диске), а затем «десериализован» обратно в живой объект.

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

Мне понравилось, как @OscarRyz представляет. Хотя здесь я продолжаю историю сериализации , которая была изначально написана @ amitgupta.

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

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

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

8 голосов
/ 26 апреля 2017

Мои два цента из моего собственного блога:

Вот подробное объяснение сериализации : (мой собственный блог)

Сериализация:

Сериализация - это процесс сохранения состояния объекта. Он представлен и хранится в виде последовательности байтов. Это может быть сохранено в файле. Процесс чтения состояния объекта из файла и его восстановления называется десериализацией.

Зачем нужна сериализация?

В современной архитектуре всегда необходимо сохранять состояние объекта, а затем извлекать его. Например, в Hibernate, чтобы сохранить объект, мы должны сделать класс Serializable. Что он делает, так это то, что после сохранения состояния объекта в виде байтов его можно перенести в другую систему, которая затем может прочитать из состояния и извлечь класс. Состояние объекта может исходить из базы данных, другого jvm или отдельного компонента. С помощью сериализации мы можем получить состояние объекта.

Код Пример и пояснение:

Сначала давайте взглянем на класс предметов:

public class Item implements Serializable{

    /**
    *  This is the Serializable class
    */
    private static final long serialVersionUID = 475918891428093041L;
    private Long itemId;
    private String itemName;
    private transient Double itemCostPrice;
    public Item(Long itemId, String itemName, Double itemCostPrice) {
        super();
        this.itemId = itemId;
        this.itemName = itemName;
        this.itemCostPrice = itemCostPrice;
      }

      public Long getItemId() {
          return itemId;
      }

     @Override
      public String toString() {
          return "Item [itemId=" + itemId + ", itemName=" + itemName + ", itemCostPrice=" + itemCostPrice + "]";
       }


       public void setItemId(Long itemId) {
           this.itemId = itemId;
       }

       public String getItemName() {
           return itemName;
       }
       public void setItemName(String itemName) {
            this.itemName = itemName;
        }

       public Double getItemCostPrice() {
            return itemCostPrice;
        }

        public void setItemCostPrice(Double itemCostPrice) {
             this.itemCostPrice = itemCostPrice;
        }
}

В приведенном выше коде видно, что Item class реализует Serializable .

Это интерфейс, который позволяет сериализуемости класса.

Теперь мы видим, что переменная с именем serialVersionUID инициализируется переменной Long. Это число вычисляется компилятором на основе состояния класса и атрибутов класса. Это число, которое поможет jvm определить состояние объекта при чтении состояния объекта из файла.

Для этого мы можем взглянуть на официальную документацию Oracle:

Среда выполнения сериализации связывается с каждым сериализуемым классом a номер версии, называемый serialVersionUID, который используется во время десериализация для проверки того, что отправитель и получатель сериализованы объект загрузил классы для этого объекта, которые совместимы с уважение к сериализации. Если получатель загрузил класс для объект, который имеет другой serialVersionUID, чем у соответствующий класс отправителя, тогда десериализация приведет к InvalidClassException. Сериализуемый класс может объявить свой собственный serialVersionUID явно, объявив поле с именем "serialVersionUID", который должен быть статическим, конечным и типа long: ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; Если Сериализуемый класс явно не объявляет serialVersionUID, тогда среда выполнения сериализации рассчитает значение по умолчанию Значение serialVersionUID для этого класса на основе различных аспектов класс, как описано в Сериализации объектов Java (TM) Спецификация. Тем не менее, настоятельно рекомендуется, чтобы все Сериализуемые классы явно объявляют значения serialVersionUID, так как вычисление serialVersionUID по умолчанию очень чувствительно к классу детали, которые могут варьироваться в зависимости от реализации компилятора, и могут таким образом приводят к неожиданным InvalidClassExceptions во время десериализации. Поэтому, чтобы гарантировать последовательный serialVersionUID значение в различных реализациях Java-компилятора, сериализуемый класс должен объявить явное значение serialVersionUID. Это также Настоятельно рекомендуется, чтобы явные объявления serialVersionUID использовали частный модификатор, где это возможно, поскольку такие объявления применяются только к немедленно объявленный класс - поля serialVersionUID не являются полезно как унаследованные члены.

Если вы заметили, что мы использовали другое ключевое слово, которое transient .

Если поле не сериализуемо, оно должно быть помечено как временное. Здесь мы пометили itemCostPrice как переходные и не хотим, чтобы они записывались в файл

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

public class SerializationExample {

    public static void main(String[] args){
        serialize();
       deserialize();
    } 

    public static void serialize(){

         Item item = new Item(1L,"Pen", 12.55);
         System.out.println("Before Serialization" + item);

         FileOutputStream fileOut;
         try {
             fileOut = new FileOutputStream("/tmp/item.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut);
             out.writeObject(item);
             out.close();
             fileOut.close();
             System.out.println("Serialized data is saved in /tmp/item.ser");
           } catch (FileNotFoundException e) {

                  e.printStackTrace();
           } catch (IOException e) {

                  e.printStackTrace();
           }
      }

    public static void deserialize(){
        Item item;

        try {
                FileInputStream fileIn = new FileInputStream("/tmp/item.ser");
                ObjectInputStream in = new ObjectInputStream(fileIn);
                item = (Item) in.readObject();
                System.out.println("Serialized data is read from /tmp/item.ser");
                System.out.println("After Deserialization" + item);
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        } catch (IOException e) {
               e.printStackTrace();
        } catch (ClassNotFoundException e) {
               e.printStackTrace();
        }
     }
}

В приведенном выше примере мы видим пример сериализации и десериализации объекта.

Для этого мы использовали два класса. Для сериализации объекта мы использовали ObjectOutputStream. Мы использовали метод writeObject для записи объекта в файл.

Для десериализации мы использовали ObjectInputStream, который читает объект из файла. Он использует readObject для чтения данных объекта из файла.

Вывод вышеуказанного кода будет выглядеть следующим образом:

Before SerializationItem [itemId=1, itemName=Pen, itemCostPrice=12.55]
Serialized data is saved in /tmp/item.ser
After DeserializationItem [itemId=1, itemName=Pen, itemCostPrice=null]

Обратите внимание, что itemCostPrice из десериализованного объекта равно null , поскольку оно не было записано.

Мы уже обсуждали основы Java-сериализации в первой части этой статьи.

Теперь давайте обсудим это подробно и как это работает.

Сначала давайте начнем с serialversionuid.

serialVersionUID используется в качестве элемента управления версиями в классе Serializable.

Если вы явно не объявите serialVersionUID, JVM сделает это за вас автоматически, основываясь на различных свойствах класса Serializable.

Алгоритм вычисления Java serialversionuid (подробнее здесь)

  1. Название класса.
    1. Модификаторы класса, записанные в виде 32-разрядного целого числа.
    2. Имя каждого интерфейса, отсортированное по имени.
    3. Для каждого поля класса, отсортированного по имени поля (кроме закрытых статических и закрытых переходных полей: имя поля. модификаторы поля записываются как 32-разрядное целое число. Дескриптор поля.
    4. Если инициализатор класса существует, запишите следующее: Имя метода.
    5. Модификатор метода, java.lang.reflect.Modifier.STATIC, записанный как 32-разрядное целое число.
    6. Дескриптор метода, () V.
    7. Для каждого не приватного конструктора, отсортированного по имени метода и сигнатуре: Имя метода,. Модификаторы Метод записывается как 32-разрядное целое число. Дескриптор метода.
    8. Для каждого не закрытого метода, отсортированного по имени метода и сигнатуре: название метода. Модификаторы метода записываются как 32-разрядное целое число Дескриптор метода.
    9. Алгоритм SHA-1 выполняется в потоке байтов, созданных DataOutputStream, и выдает пять 32-битных значений sha [0..4]. значение хеша составляется из первого и второго 32-битных значений Дайджест сообщения SHA-1. Если результат дайджеста сообщения, пять 32-битные слова H0 H1 H2 H3 H4 в массиве из пяти значений int sha, значение хеша будет вычислено следующим образом:
    long hash = ((sha[0] >>> 24) & 0xFF) |
>            ((sha[0] >>> 16) & 0xFF) << 8 |
>            ((sha[0] >>> 8) & 0xFF) << 16 |
>            ((sha[0] >>> 0) & 0xFF) << 24 |
>            ((sha[1] >>> 24) & 0xFF) << 32 |
>            ((sha[1] >>> 16) & 0xFF) << 40 |
>            ((sha[1] >>> 8) & 0xFF) << 48 |
>        ((sha[1] >>> 0) & 0xFF) << 56;

Алгоритм сериализации Java

Алгоритм сериализации объекта описан ниже:
1. Он записывает метаданные класса, связанного с экземпляром.
2. Он рекурсивно записывает описание суперкласса, пока не найдет java.lang.object .
3. Как только он заканчивает запись информации метаданных, он начинает с фактических данных, связанных с экземпляром. Но на этот раз это начинается с самого верхнего суперкласса.
4. Он рекурсивно записывает данные, связанные с экземпляром, начиная с наименьшего суперкласса, до самого производного класса.

Что нужно помнить:

  1. Статические поля в классе не могут быть сериализованы.

    public class A implements Serializable{
         String s;
         static String staticString = "I won't be serializable";
    }
    
  2. Если serialversionuid отличается в классе чтения, он выдаст исключение InvalidClassException.

  3. Если класс реализует сериализуемый, то все его подклассы также будут сериализуемыми.

    public class A implements Serializable {....};
    
    public class B extends A{...} //also Serializable
    
  4. Если у класса есть ссылка на другой класс, все ссылки должны быть сериализуемыми, иначе процесс сериализации не будет выполнен. В этом случае NotSerializableException генерируется во время выполнения.

Например:

public class B{
     String s,
     A a; // class A needs to be serializable i.e. it must implement Serializable
}
8 голосов
/ 05 июня 2011

Сериализация означает сохранение объектов в Java. Если вы хотите сохранить состояние объекта и хотите восстановить состояние позднее (возможно, в другой JVM), можно использовать сериализацию.

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

Например:

ObjectInputStream oos = new ObjectInputStream(                                 
                                 new FileInputStream(  new File("o.ser")) ) ;
SerializationSample SS = (SearializationSample) oos.readObject();

Searializable - интерфейс маркера, который отмечает, что ваш класс сериализуем. Маркерный интерфейс означает, что это просто пустой интерфейс, и использование этого интерфейса уведомит JVM о том, что этот класс можно сделать сериализуемым.

6 голосов
/ 15 января 2009

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

http://en.wikipedia.org/wiki/Serialization

3 голосов
/ 27 июля 2015

Java Сериализация объектов

enter image description here

Serialization - это механизм для преобразования графа объектов Java в массив байтов для хранения (to disk file) или передачи (across a network), а затем используя десериализацию , мы можем восстановить граф объектов. Графики объектов корректно восстанавливаются с помощью механизма разделения ссылок. Но перед сохранением проверьте, совпадают ли serialVersionUID из файла ввода / сети и файла .class serialVersionUID. Если нет, киньте java.io.InvalidClassException.

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

Синтаксис serialVersionUID

// ANY-ACCESS-MODIFIER static final long serialVersionUID = (64-bit has)L;
private static final long serialVersionUID = 3487495895819393L;

serialVersionUID необходим для процесса сериализации. Но для разработчика необязательно добавлять его в исходный файл Java. Если serialVersionUID не включен, среда выполнения сериализации сгенерирует serialVersionUID и свяжет его с классом. Сериализованный объект будет содержать этот serialVersionUID вместе с другими данными.

Примечание - Настоятельно рекомендуется, чтобы все сериализуемые классы явно объявляли serialVersionUID, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations и, таким образом, могли привести к неожиданным конфликтам serialVersionUID во время десериализации, что приведет к сбою десериализации.

Проверка сериализуемых классов

enter image description here


Объект Java доступен только для сериализации. если класс или любой из его суперклассов реализует интерфейс java.io.Serializable или его подынтерфейс, java.io.Externalizable .

  • Класс должен реализовывать java.io.Serializable интерфейс для успешной сериализации своего объекта. Serializable - это маркерный интерфейс, используемый для информирования компилятора о том, что к классу, реализующему его, необходимо добавить сериализуемое поведение. Здесь виртуальная машина Java (JVM) отвечает за автоматическую сериализацию.

    переходный Ключевое слово: java.io.Serializable interface

    При сериализации объекта, если мы не хотим, чтобы определенные элементы данных объекта были сериализованы, мы можем использовать модификатор transient. Ключевое слово transient предотвратит сериализацию этого элемента данных.

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

    переходный & летучий

    +--------------+--------+-------------------------------------+
    |  Flag Name   |  Value | Interpretation                      |
    +--------------+--------+-------------------------------------+
    | ACC_VOLATILE | 0x0040 | Declared volatile; cannot be cached.|
    +--------------+--------+-------------------------------------+
    |ACC_TRANSIENT | 0x0080 | Declared transient; not written or  |
    |              |        | read by a persistent object manager.|
    +--------------+--------+-------------------------------------+
    
    class Employee implements Serializable {
        private static final long serialVersionUID = 2L;
        static int id;
    
        int eno; 
        String name;
        transient String password; // Using transient keyword means its not going to be Serialized.
    }
    
  • Реализация интерфейса Externalizable позволяет объекту взять на себя полный контроль над содержимым и форматом сериализованной формы объекта. Методы интерфейса Externalizable, writeExternal и readExternal, вызываются для сохранения и восстановления состояния объектов. При реализации классом они могут писать и читать свое собственное состояние, используя все методы ObjectOutput и ObjectInput. Обязанность объектов - обрабатывать любые возникающие версии.

    class Emp implements Externalizable {
        int eno; 
        String name;
        transient String password; // No use of transient, we need to take care of write and read.
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeInt(eno);
            out.writeUTF(name);
            //out.writeUTF(password);
        }
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            this.eno = in.readInt();
            this.name = in.readUTF();
            //this.password = in.readUTF(); // java.io.EOFException
        }
    }
    
  • Только объекты, которые поддерживают интерфейс java.io.Serializable или java.io.Externalizable, могут быть written to / read from потоками. Класс каждого сериализуемого объекта кодируется, включая имя класса и сигнатуру класса, значения полей и массивов объекта, а также закрытие любых других объектов, на которые ссылаются исходные объекты.

Сериализуемый пример для файлов

public class SerializationDemo {
    static String fileName = "D:/serializable_file.ser";

    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        Employee emp = new Employee( );
        Employee.id = 1; // Can not Serialize Class data.
        emp.eno = 77;
        emp.name = "Yash";
        emp.password = "confidential";
        objects_WriteRead(emp, fileName);

        Emp e = new Emp( );
        e.eno = 77;
        e.name = "Yash";
        e.password = "confidential";
        objects_WriteRead_External(e, fileName);

        /*String stubHost = "127.0.0.1";
        Integer anyFreePort = 7777;
        socketRead(anyFreePort); //Thread1
        socketWrite(emp, stubHost, anyFreePort); //Thread2*/

    }
    public static void objects_WriteRead( Employee obj, String serFilename ) throws IOException{
        FileOutputStream fos = new FileOutputStream( new File( serFilename ) );
        ObjectOutputStream objectOut = new ObjectOutputStream( fos );
        objectOut.writeObject( obj );
        objectOut.close();
        fos.close();

        System.out.println("Data Stored in to a file");

        try {
            FileInputStream fis = new FileInputStream( new File( serFilename ) );
            ObjectInputStream ois = new ObjectInputStream( fis );
            Object readObject;
            readObject = ois.readObject();
            String calssName = readObject.getClass().getName();
            System.out.println("Restoring Class Name : "+ calssName); // InvalidClassException

            Employee emp = (Employee) readObject;
            System.out.format("Obj[No:%s, Name:%s, Pass:%s]", emp.eno, emp.name, emp.password);

            ois.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static void objects_WriteRead_External( Emp obj, String serFilename ) throws IOException {
        FileOutputStream fos = new FileOutputStream(new File( serFilename ));
        ObjectOutputStream objectOut = new ObjectOutputStream( fos );

        obj.writeExternal( objectOut );
        objectOut.flush();

        fos.close();

        System.out.println("Data Stored in to a file");

        try {
            // create a new instance and read the assign the contents from stream.
            Emp emp = new Emp();

            FileInputStream fis = new FileInputStream(new File( serFilename ));
            ObjectInputStream ois = new ObjectInputStream( fis );

            emp.readExternal(ois);

            System.out.format("Obj[No:%s, Name:%s, Pass:%s]", emp.eno, emp.name, emp.password);

            ois.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Сериализуемый пример по сети

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

/**
 * Creates a stream socket and connects it to the specified port number on the named host. 
 */
public static void socketWrite(Employee objectToSend, String stubHost, Integer anyFreePort) {
    try { // CLIENT - Stub[marshalling]
        Socket client = new Socket(stubHost, anyFreePort);
        ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream());
        out.writeObject(objectToSend);
        out.flush();
        client.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
// Creates a server socket, bound to the specified port. 
public static void socketRead(  Integer anyFreePort ) {
    try { // SERVER - Stub[unmarshalling ]
        ServerSocket serverSocket = new ServerSocket( anyFreePort );
        System.out.println("Server serves on port and waiting for a client to communicate");
            /*System.in.read();
            System.in.read();*/

        Socket socket = serverSocket.accept();
        System.out.println("Client request to communicate on port server accepts it.");

        ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
        Employee objectReceived = (Employee) in.readObject();
        System.out.println("Server Obj : "+ objectReceived.name );

        socket.close();
        serverSocket.close();
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

@ см

3 голосов
/ 12 сентября 2012

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

Объект для сериализации должен реализовывать интерфейс java.io.Serializable. Механизм сериализации по умолчанию для объекта записывает класс объекта, сигнатуру класса и значения всех непереходных и нестатических полей.

class ObjectOutputStream extends java.io.OutputStream implements ObjectOutput,
Интерфейс

ObjectOutput расширяет интерфейс DataOutput и добавляет методы для сериализации объектов и записи байтов в файл. ObjectOutputStream расширяет java.io.OutputStream и реализует интерфейс ObjectOutput. Он сериализует объекты, массивы и другие значения в поток. Таким образом, конструктор ObjectOutputStream записывается как:

ObjectOutput ObjOut = new ObjectOutputStream(new FileOutputStream(f));

Приведенный выше код использовался для создания экземпляра класса ObjectOutput с конструктором ObjectOutputStream( ), который принимает экземпляр FileOuputStream в качестве параметра.

Интерфейс ObjectOutput используется реализацией класса ObjectOutputStream. ObjectOutputStream создан для сериализации объекта.

Десериализация объекта в Java

Противоположная операция сериализации называется десериализацией, т. Е. Извлечение данных из серии байтов называется десериализацией, которая также называется накачкой или демаршированием.

ObjectInputStream расширяет java.io.InputStream и реализует интерфейс ObjectInput. Он десериализует объекты, массивы и другие значения из входного потока. Таким образом, конструктор ObjectInputStream записывается как:

ObjectInputStream obj = new ObjectInputStream(new FileInputStream(f));

Над кодом программы создается экземпляр класса ObjectInputStream для десериализации этого файла, который был сериализован классом ObjectInputStream. Приведенный выше код создает экземпляр с использованием экземпляра класса FileInputStream, который содержит указанный файловый объект, который необходимо десериализовать, поскольку конструктору ObjectInputStream() требуется входной поток.

...