java世界中是否有任何方法可以在不需要无参数构造函数和Serializable实现的情况下进行序列化?
9 回答
JBoss 序列化是标准 java 序列化的直接替代品,它不需要您实现java.io.Serializable
. 除此之外(事实上它更快),它与标准序列化机制相同(它甚至使用相同的ObjectInput
和ObjectOutput
接口。
PS 它不依赖于其他 JBoss 的东西,它只是 JBoss 低级库中的一个,作为一个单独的项目分解。
一种可怕的方法是构建一个并行的类层次结构,每个类代表第三方层次结构中的一个类,每个类都实现 Externalizable,并通过从第三方写入适当的字段来编写自己-党的对象。
不过,我不会。
和Databoard 一样,它可以序列化 bean-style、record-style 和 immutable-style 的类。您还可以编写自己的类外部绑定。
我相信在某些情况下,尽管有 Type 的声明,您仍可以强制序列化。但是存在固有风险,因为该类可能具有不可序列化的字段,这将导致运行时异常。
我很好奇,因为您免费获得无参数默认构造函数,除非您编写了自定义构造函数。实现 Serializable 也需要 30 秒的查找/替换。
您是否有理由试图避免这些?
...以及Serializable的实现?
不幸的是没有。所有可序列化的对象都必须实现java.io.Serializable
。至于问题的第一部分,您可以使用ObjectInputStream
/ObjectOutputStream
将对象序列化为字节数组,反之亦然。
以下示例显示了如何:
public static byte[] toByteArray(Object object) throws IOException {
if (!isSerializable(object)) {
throw new IOException("Object '" + object.getClass().getName() + "' is not serializable.");
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
oos.flush();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
logger.error("Closing of ObjectOutputStream failed.", e);
}
}
}
return baos.toByteArray();
}
public static Object toObject(byte[] bytes) throws IOException, ClassNotFoundException {
Object object = null;
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
object = ois.readObject();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
logger.error("Closing of ObjectInputStream failed.", e);
}
}
}
return object;
}
Eishay Smith对 Java 序列化程序进行了基准测试,其中包括有关每个序列化程序的一些信息,尽管它没有说明它们是否使用无参数构造函数(在许多情况下,它们甚至不使用任意对象,所以问题是没有实际意义)。那可能值得一看。
正如其他人所说,有一系列替代方案。如果你想坚持使用 writeObject 和 readObject 的标准 Java 序列化,你可以编写自己的从第三方类继承的适配器类,在你自己的类上实现 Serializable,并覆盖 writeObject 和 readObject,换句话说,实现自定义序列化你的班。
参见http://www.jguru.com/faq/view.jsp?EID=251942的解释。
实现类的构造函数的唯一要求Serializable
是其继承层次结构中的第一个不可序列化的超类必须具有无参数构造函数。
Object
没有无参数构造函数的可序列化与使用无参数构造函数扩展public class MySerializableClass implements Serializable { public MySerializableClass (...)... }
MyFirstClass
没有无参数构造函数的可序列化与使用无参数构造函数扩展public class MyFirstClass { } public class MySecondClass extends MyFirstClass implements Serializable { public MySecondClass (...)... }
NOT 可序列化,因为
MyFirstClass
未实现且Serializable
没有默认构造函数。public class MyFirstClass { public MyFirstClass (...)... } public class MySecondClass extends MyFirstClass implements Serializable { public MySecondClass (...)... }