如何在Java中测试一个类是否正确实现了Serializable(不仅仅是Serializable的实例)
2022-08-31 12:29:31
我正在实现一个可序列化的类(所以它是一个值对象,可以使用RMI)。但我需要测试它。有没有办法轻松做到这一点?
澄清:我正在实现类,因此在类定义中粘贴Serializable是微不足道的。我需要手动序列化/反序列化它,看看它是否有效。
我发现这个C#问题,Java有类似的答案吗?
我正在实现一个可序列化的类(所以它是一个值对象,可以使用RMI)。但我需要测试它。有没有办法轻松做到这一点?
澄清:我正在实现类,因此在类定义中粘贴Serializable是微不足道的。我需要手动序列化/反序列化它,看看它是否有效。
我发现这个C#问题,Java有类似的答案吗?
简单的方法是检查对象是否是 或 的实例,但这并不能真正证明该对象确实是可序列化的。java.io.Serializable
java.io.Externalizable
确定的唯一方法是真正尝试一下。最简单的测试是这样的:
new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(myObject);
并检查它是否不引发异常。
Apache Commons Lang提供了一个相当简短的版本:
SerializationUtils.serialize(myObject);
然后再次检查异常。
你可以更加严格,并检查它是否反序列化回与原始内容相同的东西:
Serializable original = ...
Serializable copy = SerializationUtils.clone(original);
assertEquals(original, copy);
等等。
基于斯卡夫曼答案的实用方法:
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);
}