为什么Java 5中不推荐使用java.io.Serializable?

时间:2011-06-17 20:37:39

标签: java serialization annotations metadata java-5

在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指定It is possible that future versions of the Java programming language will disallow the use of raw types)。那么为什么不为序列化注释做好准备?

有什么想法? (虽然我更喜欢具体的参考文献:无法找到的D)

4 个答案:

答案 0 :(得分:21)

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

public void registerObject(Serializable obj);

答案 1 :(得分:10)

  

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

是。这是问题的根源。

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

  • 使用Serializable并且“强迫”人们替换它实际上并没有什么问题是令人讨厌的。 (人们有更好的事情要做......)

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

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

  

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

实际上,实际发生的可能性很小(IMO)。据我所知,Sun / Oracle 从未删除了已弃用的功能。甚至不像Serializable和朋友那样危险。


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

答案 2 :(得分:2)

Serializabletransient确实是两件可以被注释取代的东西。

它们之所以没有被弃用,可能是因为有一个很多的程序使用Serializable,如果开发人员突然开始喷出数千个,那么对于数百万人来说它会很烦人弃用警告。

标准Java API中还有很多其他东西可以在很久以前被弃用 - 例如,遗留集合类VectorHashtable(我相信你很容易找到更多的东西)。还有其他一些可以使用注释实现的内容(例如关键字volatilestrictfpsynchronized)。

答案 3 :(得分:-1)

弃用适用于有害的事物。你所建议的是强迫八年现有Java代码的作者(当时)重写它,没有任何好处,只是为了关闭弃用编译器警告,回到他们用Java 1.4完全正确的代码。这没用。