如何在Java中测试一个类是否正确实现了Serializable(不仅仅是Serializable的实例)

2022-08-31 12:29:31

我正在实现一个可序列化的类(所以它是一个值对象,可以使用RMI)。但我需要测试它。有没有办法轻松做到这一点?

澄清:我正在实现类,因此在类定义中粘贴Serializable是微不足道的。我需要手动序列化/反序列化它,看看它是否有效。

我发现这个C#问题,Java有类似的答案吗?


答案 1

简单的方法是检查对象是否是 或 的实例,但这并不能真正证明该对象确实是可序列化的。java.io.Serializablejava.io.Externalizable

确定的唯一方法是真正尝试一下。最简单的测试是这样的:

new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(myObject);

并检查它是否不引发异常。

Apache Commons Lang提供了一个相当简短的版本:

SerializationUtils.serialize(myObject);

然后再次检查异常。

你可以更加严格,并检查它是否反序列化回与原始内容相同的东西:

Serializable original = ...
Serializable copy = SerializationUtils.clone(original);
assertEquals(original, copy);

等等。


答案 2

基于斯卡夫曼答案的实用方法:

private static <T extends Serializable> byte[] pickle(T obj) 
       throws IOException 
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(obj);
    oos.close();
    return baos.toByteArray();
}

private static <T extends Serializable> T unpickle(byte[] b, Class<T> cl)
       throws IOException, ClassNotFoundException 
{
    ByteArrayInputStream bais = new ByteArrayInputStream(b);
    ObjectInputStream ois = new ObjectInputStream(bais);
    Object o = ois.readObject();
    return cl.cast(o);
}