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

Я создаю новый процесс, используя java ProcessBuider, и я хочу, чтобы объект был отправлен родителю от создаваемого потомка.Здесь я сериализую объект с дочерней стороны и отправляю его родителю.Но когда я читаю отправленный объект от родителя, возникает исключение, говорящее

java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)

Чувствовалось, что все еще нет потоков, получаемых от родителя, когда я пытаюсь прочитать это. Parent, Child и объект Отправкаjava-файлы подробно описаны ниже.

DTO.java

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

    public DTO(String name)
    {
        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);

            builder.inheritIO();
            Process process = builder.start();

            if (process.isAlive()) {

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

            }
      }
}

Child.java

public class Child {

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

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

Что такоенеправильно что я здесь делаю?Любые предложения, чтобы исправить это

1 Ответ

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

Это начинает работать, когда вы удаляете сегмент кода builder.inheritIO(); из родительского, где удаление означает, что и дочерний, и родительский больше не будут использовать общий стандартный ввод / вывод.И ребенок, и родитель будут иметь разные стандартные операции ввода-вывода

...