OutputStream с ByteArrayOutputStream не записывается - PullRequest
0 голосов
/ 28 мая 2010

Итак, я пытаюсь записать объект в ByteArray, но по какой-то причине он ничего не записывает, что я вижу по тому факту, что возвращаемое значение равно 0, а по тому факту, что его чтение приводит к исключение.

BAoutput = new ByteArrayOutputStream();  
Oout = new ObjectOutputStream(BAoutput);  
Oout.writeObject(receiver);

где receiver - объект, который я получаю через параметр. и исключения всегда одинаковы:

java.io.EOFException
  at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
  at java.io.ObjectInputStream.readObject0(Unknown Source)
  at java.io.ObjectInputStream.readObject(Unknown Source)

Есть идеи?

большая часть кода: (над ним есть пара определений, на самом деле ничего интересного)

try {
        BAoutput = new ByteArrayOutputStream();
        Oout = new ObjectOutputStream(BAoutput);
        BAinput = new ByteArrayInputStream(BAoutput.toByteArray());
        Oin = new ObjectInputStream(BAinput);

        Oout.writeObject(receiver);
        retval = method.invoke(receiver, args);
        for (Method curr: postMethods){
            curr.setAccessible(true);
            if (curr.invoke(receiver).equals(false)){
                receiver = Oin.readObject();
                throw new PostconditionFailure();
            }
        }           
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            Oin.close();
            Oout.close();
            BAinput.close();
            BAoutput.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Ответы [ 2 ]

1 голос
/ 28 мая 2010

Первые вещи, которые нужно проверить:

  • очистить / закрыть ObjectOutputStream (как Synesso уже заявил в своем комментарии)
  • Убедитесь, что receiver является Сериализуемым (или примитивным типом)
0 голосов
/ 28 мая 2010

Это не имеет большого смысла для меня.

Итак, я пытаюсь записать объект в ByteArray, но по какой-то причине он ничего не записывает, что я вижу по тому факту, что возвращаемое значение равно 0

Что возвращает 0? Метод writeObject вообще не возвращает никакого значения - его метод void!

... и тот факт, что чтение приводит к исключению.

Это не обязательно означает, что запись не удалась.

Я думаю, что нам нужно увидеть >>> все <<< кода, который связан с чтением и записью, включая объявления типов и любые включающие блоки try / catch. </p>

РЕДАКТИРОВАТЬ

Теперь, когда я вижу полный код, становится ясно, в чем реальная проблема:

    ....
    BAoutput = new ByteArrayOutputStream();
    Oout = new ObjectOutputStream(BAoutput);
    BAinput = new ByteArrayInputStream(BAoutput.toByteArray());
    Oin = new ObjectInputStream(BAinput);
    ...

Метод ByteArrayOutputStream.toByteArray() возвращает копию текущего содержимого потока. Поскольку в поток еще ничего не записано, массив байтов, естественно, пуст.

Решением вашей проблемы является извлечение байтового массива и создание ByteArrayInputStream после , когда вы закончили запись в Oout и сбросили или закрыли его.

...