Получите EOFException при чтении сериализованного объекта в Java - PullRequest
0 голосов
/ 30 ноября 2010

У меня есть два метода, один из которых сериализует объект, и он работает нормально:

public void record()throws RecordingException
    {
        ObjectOutputStream outputStream = null;
        try
        {
            outputStream = new ObjectOutputStream(new FileOutputStream("src/data/employee.dat"));
            outputStream.writeObject(this);
        } catch (FileNotFoundException ex)
        {
            ex.printStackTrace();
            throw new RecordingException(ex);
        } catch (IOException ex)
        {
            ex.printStackTrace();
            throw new RecordingException(ex);
        }finally
        {
            try
            {
                if (outputStream != null) outputStream.close();
            } catch (IOException ex){}
        }
    }

Проблема здесь при десериализации объекта, я получаю EOFException!:

public final User loadObject(UserType usertype) throws InvalidLoadObjectException
    {
        ObjectInputStream istream = null;
        String path = null;
        if (usertype == UserType.EMPLOYEE)
        {
            path = "data/employee.dat";
        }else if (usertype == UserType.CUSTOMER)
        {
            path = "data/customer.dat";
        }else
            throw new InvalidLoadObjectException("Object is not a sub class of User");

        try 
        {
            istream = new ObjectInputStream(ObjectLoader.class.getClassLoader().getResourceAsStream(path));             

            User u = loadObject(istream);
            istream.close();
            return u;
        }catch (EOFException ex)
        {
            System.out.println(ex.getMessage());
            return null;
        }catch(Exception ex)
        {
            ex.printStackTrace();
            throw new InvalidLoadObjectException(ex);
        }
    }

private User loadObject(ObjectInputStream stream) throws InvalidLoadObjectException
    {
        try
        {
            return (User) stream.readObject();
        } catch (IOException ex)
        {
            ex.printStackTrace();
            throw new InvalidLoadObjectException(ex);
        } catch (ClassNotFoundException ex)
        {
            ex.printStackTrace();
            throw new InvalidLoadObjectException(ex);
        }
    }

Ответы [ 3 ]

0 голосов
/ 30 ноября 2010

Попробуйте outputStream.flush() перед закрытием потока в объекте сериализации.

0 голосов
/ 30 ноября 2010

Я не знаю, является ли это причиной вашей проблемы, но код, который записывает файл, имеет тонкий недостаток.В блоке finally вы закрываете поток и игнорируете любые исключения .Если метод close() выполняет окончательный flush(), то любые исключения, выброшенные во флэш-памяти, не будут отображены.

0 голосов
/ 30 ноября 2010

Файл был пуст или не содержал полную сериализацию объекта.

...