【问题标题】: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
相关资源
最近更新 更多