实现readObject和writeObject方法以覆盖java中的默认序列化时允许例外?

时间:2014-01-22 13:28:57

标签: java serialization deserialization

我知道我们必须使用以下签名定义方法来覆盖默认的序列化过程:

private void writeObject(ObjectOutputStream os) {
}

private void readObject(ObjectInputStream is) {
}

上述方法可以抛出的异常类型是否有任何限制?我知道方法抛出的异常不是方法签名的一部分,而是想确认。

2 个答案:

答案 0 :(得分:1)

Serializable定义了以下例外情况:

private void writeObject(java.io.ObjectOutputStream out)
    throws IOException
private void readObject(java.io.ObjectInputStream in)
    throws IOException, ClassNotFoundException;
private void readObjectNoData()
    throws ObjectStreamException;

这是调用write方法的地方:

        try {
            writeObjectMethod.invoke(obj, new Object[]{ out });
        } catch (InvocationTargetException ex) {
            Throwable th = ex.getTargetException();
            if (th instanceof IOException) {
                throw (IOException) th;
            } else {
                throwMiscException(th);
            }
        }

// ...

private static void throwMiscException(Throwable th) throws IOException {
    if (th instanceof RuntimeException) {
        throw (RuntimeException) th;
    } else if (th instanceof Error) {
        throw (Error) th;
    } else {
        IOException ex = new IOException("unexpected exception type");
        ex.initCause(th);
        throw ex;
    }
}

正如您所看到的,您可以抛出任何非运行时异常,它将被包装在IOException中,但由于更短的堆栈跟踪和更有用的错误消息,您应该更喜欢IOExceptions。

我假设read方法被类似地调用,你可能想要自己检查它。

答案 1 :(得分:0)

您可以在两种方法中抛出任何RuntimeException

在writeObject(ObjectOutputStream out)中,您也可以抛出IOException

在readObject(ObjectInputStream in)中,yu也可以抛出IOExceptionClassNotFoundException