23

在 Java 5 之前,没有注释。因此,您无法将元数据添加到类中。

要将类标记为可序列化,您必须实现Serializable接口(就是一个标记)并transient在需要时使用更多关键字将字段标记为不可序列化,例如:

public class MyClass implements Serializable {
   ...
   private transient Bla field;
   ...
}

现在您理论上可以使用注释(这是它们的完美用途)并具有:

@Serializable
public class MyClass {
   ...
   @Transient
   private Bla field;
   ...
}

但是接口和关键字并没有被弃用,Java 5 中也没有添加注释来替换它们。

这个决定保留接口和关键字的考虑是什么?

当然存在与 Java 5 之前代码的兼容性问题,但在某些时候会结束(例如,与泛型的新特性有关,JLS 指定Java 编程语言的未来版本可能不允许使用原始类型)。那么为什么不也为序列化注解做好准备呢?

有什么想法吗?(虽然我更喜欢具体的参考资料:D,但找不到)

4

4 回答 4

21

接口在那里,因此可以定义方法来接受 Serializable 类型的对象:

public void registerObject(Serializable obj);
于 2011-06-17T20:44:11.100 回答
10

当然,还有与 Java 5 之前的代码兼容的问题......

是的。这是问题的根源。

  • 如果它们是(比如说)Java 5 中@deprecatedSerializable接口,那么许多旧的 Java 5 之前的代码会给出警告(或错误,取决于编译器开关)。

  • 使用Serializable和“强迫”人们更换它实际上并没有什么问题,这很烦人。(人们有更好的事情要做......)

  • 当人们在他们的代码中“修复”了这个问题时,它将不再使用 Java 5 之前的编译器进行编译,或者在 Java 5 之前的 JVM 上运行。

  • 做一些使编译器系统地“哭狼”的事情是个坏主意。

...但在某些时候会结束。

实际上,这种情况实际发生的可能性很小(IMO)。据我所知,Sun / Oracle从未删除过弃用的功能。甚至像Thread.stop()和朋友一样危险的人也不行。


作为脚注,Go 开发人员正在采取不同的方法来解决这个问题。当他们想要更改语言或库功能时,他们只是这样做。他们提供了一个转换器,可以根据需要自动重写您的代码。

于 2011-06-18T00:17:47.767 回答
2

Serializable并且transient确实是可以被注释取代的两件事。

它们没有被弃用可能是因为有很多程序在使用Serializable,如果编译器突然开始发出数千条弃用警告,那么开发人员会很烦人。

标准 Java API 中还有很多其他的东西早就被弃用了——例如,遗留集合类VectorHashtable(我相信你可以很容易地找到更多的东西)。还有其他可以使用注释来实现的东西(例如关键字和volatile)。strictfpsynchronized

于 2011-06-17T20:54:14.580 回答
-1

弃用是针对积极有害的事物。您的建议是强迫八年现有 Java 代码的作者(当时)重写它,这没有任何好处,只是为了关闭弃用编译器警告,以恢复他们在 Java 1.4 中拥有的完全正确的代码. 那将没有用。

于 2016-09-28T13:58:23.820 回答