java.io.StreamCorruptedException: недопустимый код типа: 3F при настройке процесса сериализации

#java #serialization #io #customization

#java — язык #сериализация #io #настройка #java

Вопрос:

Пожалуйста, помогите понять причину проблемы с сериализацией.

У меня есть следующее объявление целевого класса:

 class Line implements Serializable {
    int index;

    public Line() {
        System.out.println("Constructing empty line");
    }

    Line( int index) {
        System.out.println("Constructing line: "   index);
        this.index = index;
    }

    //get and set

    public void printInfo() {
        System.out.println("Line: "   index);
        System.out.println(" Object reference: "   super.toString());         
    }
}
  

и следующий основной:

             ...

            FileOutputStream os = new FileOutputStream(fileName);
            ObjectOutputStream oos = new ObjectOutputStream(os);
            oos.writeObject(line1);
            oos.close();
            System.out.println("Read objects:");
            FileInputStream is = new FileInputStream(fileName);
            ObjectInputStream ois = new ObjectInputStream(is);

            Line line = (Line) ois.readObject();
            line.printInfo();

            ois.close();
            ...
  

этот код работает хорошо, но если я добавлю в целевой класс следующие методы:

     private void writeObject(ObjectOutputStream oos) throws IOException {
        // default serialization
        System.out.println("custom serialization!!!!");
        oos.defaultWriteObject();
    }

    private void readObject(ObjectInputStream objectInputStream) throws
            IOException, ClassNotFoundException {
        System.out.println("custom Deserialization!!!!");
        objectInputStream.readObject();
    }
  

Я вижу:

 java.io.StreamCorruptedException: invalid type code: 00
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1355)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
    at io_nio.Line.readObject(SerializationWithReferencesToComplicatedObjects.java:164)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...
  

В чем причина проблемы?

Ответ №1:

Вы должны вызывать ObjectInputStream.defaultReadObject() в своем readObject() методе. Нет ObjectInputStream.readObject() .