为什么Java有瞬态字段?
在transientJava
中关键字用于指示字段不应该是系列化的一部分(这意味着保存,像一个文件)的过程。
从Java语言规范,Java SE 7中版,第8.3.1.3节。transient领域:
可以标记变量transient以指示它们不是对象持久状态的一部分。
例如,你可能具有从其他字段派生的字段,并且仅应以编程方式进行操作,而不要通过序列化来保持状态。
这是一个GalleryImage
包含图像和从图像派生的缩略图的类:
class GalleryImage implements Serializable
{
private Image image;
private transient Image thumbnailImage;
private void generateThumbnail()
{
// Generate thumbnail.
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
generateThumbnail();
}
}
在此示例中,thumbnailImage
是通过调用该generateThumbnail
方法生成的缩略图。
该thumbnailImage
字段标记为transient
,因此只有image
原始图像被序列化,而不是保留原始图像和缩略图图像。这意味着保存序列化对象将需要较少的存储空间。(当然,根据系统的要求,这可能不合要求-只是一个例子。)
在反序列化时,readObject
调用该方法以执行将对象的状态恢复回发生序列化的状态所需的任何操作。在此,需要生成缩略图,因此将readObject
覆盖该方法,以便通过调用该generateThumbnail
方法来生成缩略图。
有关其他信息,“ 发现Java序列化API的秘密”一文(最初在Sun Developer Network上提供)中的一节讨论了的用法,并提出了transient
使用关键字防止某些字段序列化的方案。
问题内容: 我正在阅读Java的ArrayList的源代码,并且遇到了它的支持数组声明: 为什么这需要是瞬态的?为什么不能对此类进行序列化? 谢谢您的帮助! 问题答案: 它 可以 被序列化; 该班只是需要照顾的事情本身,而不是使用默认的机制。查看该类中的和方法,它们是标准序列化机制的一部分。 如果您查看源代码,则会看到它不保存后备阵列。相反,它一次将元素(包括空值)序列化到最大限制。这避免了序列化
问题内容: 我正在阅读 有效Java中的 序列化一章。 谁调用readObject()和writeObject()?为什么将这些方法声明为私有? 下面是书中的一段代码 是否有任何特定原因将变量声明为瞬时变量,然后在writeObject方法中将其显式写入?如果未声明为瞬态,则无论如何都应该编写它,对吗? 问题答案: (1)方法未在任何类或接口中声明。一个实现接口并需要 在序列化和反序列化过程中进行
我正在使用Jackson 2.1.4将POJO序列化为JSON,但我想忽略序列化的特定字段。我使用了瞬态,但它仍然在序列化该元素。 我正在序列化如下: 请不要建议,因为我不想将我的模型与杰克逊特定的注释联系起来。是否可以仅使用瞬态完成?对象映射器上是否有任何用于可见性设置的 API?
问题内容: 瞬态关键字将用于防止特定变量的序列化。但是为什么我们不应该序列化数据呢?有内部安全感吗? 问题答案: 有些类本质上是不可序列化的,因为它们表示Manage Java环境之外的资源。例如,a 不能真正序列化,因为它表示一个打开的文件句柄。对于a同样如此:您无法保存和恢复“打开的套接字”。 如果要序列化具有该类型字段的对象,则必须将这些字段标记为瞬态。 使用的另一个原因是您的类进行某种内部
Spring Roo有一个@RooJavaBean注释,它为非瞬态字段生成AsheJ getter和setter。问题是它也为瞬态字段生成它们。我在Asset.java中有这个: 我有以下Asset_Roo_JavaBean.aj: 即使一个字段是暂时的,我想您仍然可以使用getter和setter访问它,但是为什么文档会对gettersByDefault注释字段这样说呢 是否为此类中声明的每个非
是否有方法序列化类的瞬态字段?文档中提到默认情况下不支持它,但是否有办法打开它? 非常感谢