java.io.StreamCorruptedException: недопустимый заголовок потока при записи в стандартный вывод в дочернем процессе при взаимодействии дочернего и родительского объекта ProcessBuilder - PullRequest
0 голосов
/ 21 мая 2018

У меня есть сегмент кода, в котором создается новый дочерний процесс, и некоторые из результатов новых операций процесса необходимо отправить в родительский процесс от дочернего процесса.Поэтому я создаю новый ObjectOutputStream для стандартного вывода дочернего класса ObjectOutputStream stream = new ObjectOutputStream(System.out);, сериализую объекты из дочернего процесса и отправляю его родителю, а десериализация выполняется внутри родительского элемента.

Он отлично работает сбез вопросов.Но проблема возникает, когда я пытаюсь использовать System.out.println() в дочернем коде, где он также записывает в стандартный вывод.Родительский процесс также пытается десериализовать System.out.println(), и тогда в родительском процессе будут возникать исключения.

Классы подробно описаны ниже

public class DTO implements Serializable{
    private static final long serialVersionUID = 1L;
    private String name;

    public DTO()
    {
        this.name = "name";
    }

    public String getName() {
        return name;
    }

@Override
    public int hashCode() {}

@Override
public boolean equals(Object obj) {}

Parent.java

public class Parent {

  public static void main(String[] args) {

      try {
          new Parent().start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

      public void start() throws IOException, InterruptedException, ClassNotFoundException
      {
            String classpath = System.getProperty("java.class.path");
            String className = Child.class.getCanonicalName();

            ProcessBuilder builder = new ProcessBuilder(
                "java", "-cp", classpath, className);

            Process process = builder.start();

            if (process.isAlive()) {

                ObjectInputStream input = new ObjectInputStream(process.getInputStream());
                DTO dto = (DTO)input.readObject();

            }
      }
}

Child.java

public class Child {

    public static void main(String[] args) throws IOException {
        DTO dto = new DTO();

        System.out.println("printing random text here");

        ObjectOutputStream stream = new ObjectOutputStream(System.out);
        stream.writeObject(dto);
        stream.flush();
        stream.close();
    }
}

Исключение

java.io.StreamCorruptedException: invalid stream header: 64617364
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at working.Parent.start(Parent.java:35)
    at working.Parent.main(Parent.java:14)

обратите внимание, что если мы удалим System.out.println(), используемый в child.java, программа будет выполнена без ошибок.Поскольку я думаю, что это происходит потому, что и сериализация, и sysout записывают в стандартный вывод, родитель думает, что он может десериализовать оба.Буду признателен за любые предложения по исправлению этого или другого типа подхода для этого

1 Ответ

0 голосов
/ 22 мая 2018

Вы испортили поток, записав в него строку напрямую.Итак, вы получили StreamCorruptedException.Там нет ничего удивительного.Вы не можете сделать это.Вы не можете десериализовать поток объекта, который также содержит случайные интерполированные System.out.println() s.Это должно быть очевидно.

Любое предложение исправить это

Да.Не делайте этого.

или альтернативный подход

Альтернативный подход к чему?

Вам просто нужно решить чтовы используете System.out для. Либо это поток вывода объекта или , в который он используется для печати текста.Не одновременно в обоих случаях.

NB. Вы до сих пор не вставили ни одного кода для чтения потока ошибок, как я уже говорил вам в последний раз, когда вы публиковали этот код .Вы не можете развернуть код без проверки ошибок.

...