Чтение и запись объектов и примитивных типов с помощью ObjectOutputStream/ObjectInputStream

Чтение и запись объектов и примитивных типов с помощью ObjectOutputStream/ObjectInputStream

Для ObjectOutputStream/ObjectInputStream также важно соблюдать порядок записи/чтения данных: объекты должны считываться в том же порядке, в котором были записаны. Иначе можно словить java.lang.ClassCastException.


class Tiger implements Serializable {
String name = "tiger";
}


class Horse implements Serializable {
String name = "horse";
}


FileOutputStream fos = new FileOutputStream(new File("myFile.txt"));
ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream("myFile.txt");
ObjectInputStream ois = new ObjectInputStream(fis);

oos.writeObject(new Tiger());
oos.writeObject(new Horse());
oos.flush();

Horse horse = (Horse)ois.readObject(); // вылетит java.lang.ClassCastException 
Tiger tiger = (Tiger)ois.readObject();
ObjectOutputStream/ObjectInputStream могут работать не только с объектами, но и с примитивными типами, аналогично DataOutputStream/DataInputStream.
Если в случае с примитивами нарушение порядка приводит к неожиданным результатам, то в случае с чередованием объектов и примитивов может быть выброшено java.io.EOFException.


oos.writeObject(new Tiger());
oos.writeFloat(25.05F);
oos.flush();

ois.readFloat(); // вылетит EOFException
ois.readObject(); 
Потоки ввода/вывода