【问题标题】:Interface implementation concept接口实现概念
【发布时间】:2014-07-15 07:39:10
【问题描述】:

在java中,如果我们在一个类中实现一个接口,我们必须为接口中存在的方法提供实现。但是在Serializable接口的情况下,我们不需要为存在的方法提供实现Serializable 接口。为什么???

【问题讨论】:

  • Serializable 接口不包含任何方法。我在想 TL;DR 版本是因为在 Java 有注释之前需要序列化数据。如果您今天要这样做,您可能会使用注解,就像 JPA 使用 @Entity 一样,但是更改它会破坏所有代码。

标签: java interface serializable


【解决方案1】:

但是在 Serializable 接口的情况下我们不需要提供 实现 Serializable 接口中存在的方法。为什么???

因为它仅用于标记目的,并且包含没有方法来实现。

当一个类被Serializable 接口“标记”时,它仅仅意味着它应该/可以被序列化/反序列化。

来自 Oracle 的docs:

没有实现这个接口的类不会有任何 他们的状态被序列化或反序列化。可序列化的所有子类型 类本身是可序列化的。序列化接口没有 方法或字段,仅用于识别存在的语义 可序列化。

来自Wikipedia:

Java 中标记接口的应用示例 编程语言是 Serializable 接口。一个类实现 这个接口表明它的非瞬态数据成员可以 写入 ObjectOutputStream。 ObjectOutputStream 私有 方法 writeObject() 包含一系列 instanceof 测试 确定可写性,其中之一寻找 Serializable 界面。如果这些测试中的任何一个失败,该方法将抛出一个 NotSerializableException。

例如,如果以下类不使用Serializable 接口标记:

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

那么下面的序列化代码将会失败,NotSerializableException:

Employee e = new Employee();
e.name = "Reyan Ali";

FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /tmp/employee.ser");

注意*.ser文件扩展名,在将序列化的java对象写入文件时使用。

【讨论】:

  • 我真的很想知道标记界面内部是如何工作的?
猜你喜欢
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多