我有一个代码段,其中创建了一个新的子进程,并且需要将一些新的进程操作结果从子进程发送到父进程。因此,我为子类ObjectOutputStream stream = new ObjectOutputStream(System.out);
的标准输出创建一个新的ObjectOutputStream,并从子进程序列化对象并发送给父进程,并在父进程内完成反序列化。
它没有任何问题。但是当我尝试在子代码中使用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)
请注意,如果我们删除了child.java中使用的System.out.println()
,程序将执行而不会出错。我认为这是因为序列化和sysout
都写入标准输出,父母认为它可以反序列化两者。任何建议来解决这个或不同类型的方法来做到这一点将不胜感激
答案 0 :(得分:0)
您通过直接向其写入字符串来损坏流。所以你得到了StreamCorruptedException
。这并不奇怪。你不能这样做。您不能反序列化也包含随机插值System.out.println()
的对象流。这应该是显而易见的。
任何解决此问题的建议
是。不要这样做。
或替代方法
替代方法是什么?
您只需决定您正在使用System.out
的内容。 它是一个对象输出流或它用于打印文本。不是两个在同一时间。
注意:您仍然没有输入任何代码来读取错误信息流,因为我告诉您last time you posted this code。您无法在没有错误检查的情况下部署代码。