Java序列化库不需要no-arg构造函数和Serializable的实现

在java-world中是否有任何方法可以序列化而不需要no-arg构造函数和Serializable的实现?

JBoss Serialization是标准java序列化的直接替代品,它不需要您实现java.io.Serializable 。 除此之外(事实上它更快),它与标准序列化机制相同(它甚至使用相同的ObjectInputObjectOutput接口。

PS它不依赖于其他JBoss的东西,它只是作为一个单独项目分解的JBoss低级库之一。

查看XStream , JSX或Google Protocol Buffers 。

一种可怕的方法是构建一个并行的类层次结构,每个类都代表第三方层次结构中的一个类,每个类实现Externalizable,并通过编写第三个类中的相应字段来编写自身。党的对象。

不过,我不会。

我相信在某些情况下你可以强制序列化,尽管Type的声明。 但是存在固有风险,因为类可能具有不可序列化的字段,这将导致运行时exception。

我很好奇,因为除非你有自定义构造函数,否则你可以免费获得no-arg默认构造函数。 同样实现Serializable需要30秒的查找/替换。

你有没有理由想避免这些?

Eishay Smith已经对Java序列化程序进行了基准测试,其中包含了有关每个 序列化程序的一些信息 ,尽管它没有说明它们是否使用了无参数构造函数(在许多情况下,它们甚至不使用任意对象,所以问题是没有实际意义)。 这可能值得一看。

和Databoard一样 ,它可以序列化bean风格,记录风格和不可变风格的类。 您也可以编写自己的类外部绑定。

正如其他人所说,有一系列的选择。 如果你想坚持使用writeObject和readObject的标准Java序列化,你可以编写自己的inheritance自第三方类的适配器类,在你自己的类上实现Serializable,并覆盖writeObject和readObject,换句话说,实现自定义序列化你的class。

…和Serializable的实现?

不幸的是不是 所有Seri​​alizable对象都必须实现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; } 

请参阅http://www.jguru.com/faq/view.jsp?EID=251942说明。

对于实现Serializable的类,构造函数的唯一要求是其inheritance层次结构中的第一个非可序列化超类必须具有无参数构造函数。

  1. Serializeble没有无参构造函数作为带有无参数构造函数的extends Object

     public class MySerializableClass implements Serializable { public MySerializableClass (...)... } 
  2. Serializeble没有无参数构造函数作为扩展MyFirstClass与无参数构造函数

     public class MyFirstClass { } public class MySecondClass extends MyFirstClass implements Serializable { public MySecondClass (...)... } 
  3. 不可序列化,因为MyFirstClass不是实现Serializable并且没有默认构造函数。

     public class MyFirstClass { public MyFirstClass (...)... } public class MySecondClass extends MyFirstClass implements Serializable { public MySecondClass (...)... }