2

快速提问,当将对象标记为可序列化时,它是否需要是 JavaBean?我的意思是,你能序列化一个不是 JavaBean 的对象吗?它有任何风险吗?如果您打算将对象序列化,那么始终将其设为 JavaBean 是一种好习惯吗?

4

4 回答 4

13

你以错误的方式看待它。Java Bean 是任何

1) 实现 Serializable
2) 具有无参数构造函数
3) 具有私有成员和 setter/getter

所以你的问题

将对象标记为可序列化,它是否需要是 JavaBean?

有它倒退。通过实现接口,任何类都可以是可序列化的。并非所有可序列化的类都定义了 Java Bean。

我的意思是,你能序列化一个不是 JavaBean 的对象吗?

是的。

如果您打算将对象序列化,那么始终将其设为 JavaBean 是一种好习惯吗?

在设计类时考虑数据封装是一种很好的做法。这意味着直接限制对字段的访问,并在适当的情况下使用 setter 和 getter。

当然,从 API 的角度来看,并不总是需要一个公共的无参数构造函数。

如果您要使用一个依赖于您的类是 Java Bean 的库,那么您实际上只需要遵循 Java bean 标准。

于 2012-11-12T21:41:46.553 回答
2

Serializable 是一个标记接口。您使用可序列化接口标记的每个对象都可以通过线路发送或保存在文件中。例如,如果您使用可序列化接口标记类 Foo,您可以保护文件中的对象状态并在以后恢复它:

public class Foo implements java.io.Serializable{  
  public String name;
}


public main(){
 Foo foo = new Foo();
 foo.name="test";
  try
  {
     FileOutputStream fileOut = new FileOutputStream("foo.file");
     ObjectOutputStream out = new ObjectOutputStream(fileOut);
     out.writeObject(foo);
  }
}

这意味着它不需要是 JavaBean。它可能是一个普通的旧 java 对象,如 Foo 对象示例。

于 2012-11-12T21:50:49.213 回答
0

如果要序列化类的对象,则该类需要实现可序列化接口,而不管它是具有简单属性的 bean(或)类。

序列化对象意味着将其状态转换为字节流,以便字节流可以恢复为对象的副本。如果 Java 对象的类或其任何超类实现了 java.io.Serializable 接口或其子接口 java.io.Externalizable,则它是可序列化的。反序列化是将对象的序列化形式转换回对象副本的过程

教程可能会对您有所帮助

于 2012-11-12T21:38:00.593 回答
0

您可以序列化任何实现 Serializable 接口的对象,无论它是否是 JavaBean。

也就是说,不应轻易做出使对象可序列化的决定,因为它锁定了类的某些实现细节,从而降低了未来的灵活性。

有关实现 Serializable 的信息,请参见此处

于 2012-11-12T21:43:43.007 回答