为什么java.io.Serializable在Java 5中没有被弃用?

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

要将类标记为可序列化,您必须实现可序列化接口(它只是一个标记),并在需要时使用其他关键字将字段标记为不可序列化,如下所示: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我无法找到)


答案 1

接口就在那里,因此可以定义方法以接受可序列化类型的对象:

public void registerObject(Serializable obj);

答案 2

当然,存在与Java 5之前代码的兼容性问题...

是的。这是问题的根源。

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

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

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

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

...但在某个时候,这将结束。

实际上,这种情况实际发生的几率很小(IMO)。据我所知,Sun / Oracle从未删除过已弃用的功能。甚至没有像朋友这样的危险者。Thread.stop()


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