阅读Instant
类的源代码,我碰到了这个方法
/** * Defend against malicious streams. * * @param s the stream to read * @throws InvalidObjectException always */ private void readObject(ObjectInputStream s) throws InvalidObjectException { throw new InvalidObjectException("Deserialization via serialization delegate"); }
描述让我很好奇.什么是"恶意流"?这种方法如何防御呢?
Instant
和其他java.time
类,使用包作用域委托序列化 - java.time.Ser
.请参阅writeReplace
方法以查看如何创建委托.
因此,readObject
可以调用该方法的唯一方法是,如果有人传入恶意流(一个用于尝试创建无效对象的唯一目的).该例外可确保阻止此类恶意流.
通常,只要使用序列化委托,就应该考虑readObject
像这样阻塞.