Рубрики
Без рубрики

Как прочитать объект из файла в Java (ObjectInputStream)

В этом примере показано, как использовать ObjectInputStream для чтения сериализованного объекта из файла на Java, он же десериализация; И примеры фильтров десериализации для фильтрации входящих сериализованных данных.

В этом примере показано, как использовать ObjectInputStream для чтения сериализованного объекта из файла на Java, он же Десериализация .

  public static Object readObjectFromFile(File file) throws IOException, ClassNotFoundException {
      Object result = null;
      try (FileInputStream fis = new FileInputStream(file);
           ObjectInputStream ois = new ObjectInputStream(fis)) {
          result = ois.readObject();
      }
      return result;
  }

  // Convert byte[] to object, with deserialization filter, Java 9
  public static Object convertBytesToObject(byte[] bytes, ObjectInputFilter filter) {
      InputStream is = new ByteArrayInputStream(bytes);
      try (ObjectInputStream ois = new ObjectInputStream(is)) {

          // add filter before readObject
          ois.setObjectInputFilter(filter);

          return ois.readObject();
      } catch (IOException | ClassNotFoundException ioe) {
          ioe.printStackTrace();
      }
      throw new RuntimeException();
  }

Дальнейшее Чтение

  • Примеры сериализации и десериализации Java

1. Считывание сериализованного объекта из файла (ObjectInputStream)

Приведенный ниже пример преобразует объект Person в поток байтов и сохраняет его в файл (сериализация). Позже он считывает поток байтов из того же файла и преобразует его обратно в исходный объект (десериализация).

package com.mkyong.io.object;

import java.io.Serializable;
import java.math.BigDecimal;

public class Person implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name;
    private int age;

    // dun save this field into file
    private transient BigDecimal salary;

    //getters, setters, constructor
}

package com.mkyong.io.object;

import java.io.*;
import java.math.BigDecimal;

public class HelloSerializationFile {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        Person person = new Person("mkyong", 50, new BigDecimal(1000));

        File file = new File("person.bin");

        writeObjectToFile(person, file);

        Person p = (Person) readObjectFromFile(file);

        System.out.println(p);

    }

    // Serialization
    // Save object into a file.
    public static void writeObjectToFile(Person obj, File file) throws IOException {
        try (FileOutputStream fos = new FileOutputStream(file);
             ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(obj);
            oos.flush();
        }
    }

    // Deserialization
    // Get object from a file.
    public static Object readObjectFromFile(File file) throws IOException, ClassNotFoundException {
        Object result = null;
        try (FileInputStream fis = new FileInputStream(file);
             ObjectInputStream ois = new ObjectInputStream(fis)) {
            result = ois.readObject();
        }
        return result;
    }

}

2. Дополнительные примеры десериализации

  // Deserialization
  // Get object from a file.
  public static Person readObject(File file) throws IOException, ClassNotFoundException {
      Person result = null;
      try (FileInputStream fis = new FileInputStream(file);
           ObjectInputStream ois = new ObjectInputStream(fis)) {
          result = (Person) ois.readObject();
      }
      return result;
  }

  // Deserialization
  // generic example
  @SuppressWarnings("unchecked")
  public static  T readObject(InputStream is, Class anyClass)
      throws IOException, ClassNotFoundException {
      T result = null;
      try (ObjectInputStream ois = new ObjectInputStream(is)) {
          result = (T) ois.readObject();
      }
      return result;
  }

  // Deserialization
  // Convert object to byte[]
  public static byte[] convertObjectToBytes(Object obj) {
      ByteArrayOutputStream boas = new ByteArrayOutputStream();
      try (ObjectOutputStream ois = new ObjectOutputStream(boas)) {
          ois.writeObject(obj);
          return boas.toByteArray();
      } catch (IOException ioe) {
          ioe.printStackTrace();
      }
      throw new RuntimeException();
  }

3. Фильтры десериализации Java 9

В Java десериализация из ненадежных байтовых потоков чрезвычайно опасна . Так, В Java 9 введены фильтры десериализации для фильтрации входящих данных сериализации.

В приведенном ниже примере показано, как использовать фильтры десериализации только для десериализации объектов из com.mkyong.io.object. Человек и java.база/* . Другие все отвергают ! * .

package com.mkyong.io.object;

import java.io.*;
import java.math.BigDecimal;

public class HelloDeserializationFilter {

  public static void main(String[] args) {

      // this ok
      //Person person = new Person("mkyong", 40, new BigDecimal(900));

      // reject this Person2, only allow Person class
      Person2 person = new Person2("mkyong", 40, new BigDecimal(900), "test");

      byte[] bytes = convertObjectToBytes(person);

      // only allow to deserialize com.mkyong.io.object.Person and java.base/*
      // !* reject all
      ObjectInputFilter filter =
              ObjectInputFilter.Config.createFilter(
                      "com.mkyong.io.object.Person;java.base/*;!*");

      Person p = (Person) convertBytesToObject(bytes, filter);

      System.out.println(p);
  }

  // Convert object to byte[]
  public static byte[] convertObjectToBytes(Object obj) {
      ByteArrayOutputStream boas = new ByteArrayOutputStream();
      try (ObjectOutputStream ois = new ObjectOutputStream(boas)) {
          ois.writeObject(obj);
          return boas.toByteArray();
      } catch (IOException ioe) {
          ioe.printStackTrace();
      }
      throw new RuntimeException();
  }

  // Convert byte[] to object, with filter
  public static Object convertBytesToObject(byte[] bytes, ObjectInputFilter filter) {
      InputStream is = new ByteArrayInputStream(bytes);
      try (ObjectInputStream ois = new ObjectInputStream(is)) {

          // add filter before readObject
          ois.setObjectInputFilter(filter);

          return ois.readObject();
      } catch (IOException | ClassNotFoundException ioe) {
          ioe.printStackTrace();
      }
      throw new RuntimeException();
  }

}

Выход

java.io.InvalidClassException: filter status: REJECTED
  at java.base/java.io.ObjectInputStream.filterCheck(ObjectInputStream.java:1412)
  at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2053)
  at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1907)
  at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2209)
  at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1742)
  at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:514)
  at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:472)
  at com.mkyong.io.object.HelloDeserializationFilter.convertBytesToObject(HelloDeserializationFilter.java:48)
  at com.mkyong.io.object.HelloDeserializationFilter.main(HelloDeserializationFilter.java:23)
Exception in thread "main" java.lang.RuntimeException
  at com.mkyong.io.object.HelloDeserializationFilter.convertBytesToObject(HelloDeserializationFilter.java:52)
  at com.mkyong.io.object.HelloDeserializationFilter.main(HelloDeserializationFilter.java:23)

Дальнейшее Чтение

Скачать Исходный Код

$клон git https://github.com/mkyong/core-java.git

$cd java-ввод-вывод/com/mkyong/ввод-вывод/объект

Рекомендации

Оригинал: “https://mkyong.com/java/how-to-read-an-object-from-file-in-java/”