У меня есть сегмент кода, в котором создается новый дочерний процесс, и некоторые из результатов новых операций процесса необходимо отправить в родительский процесс от дочернего процесса.Поэтому я создаю новый 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
записывают в стандартный вывод, родитель думает, что он может десериализовать оба.Буду признателен за любые предложения по исправлению этого или другого типа подхода для этого