虽然Java中的Serializable接口没有方法,没有字段,但它可以实现其function。 怎么样?

尽管java.io.Serializable接口public interface Serializable{}令人惊讶地不包含Java中的任何方法和字段,但实现此接口的类能够实现序列化和反序列化的function(被序列化的对象的状态或反序列化)。 如何在Java中没有任何方法或字段的情况下实现序列化和反序列化的function?

某些接口仅用作“标记”或“标记”。

通过reflection访问UID和自定义读取器/写入器。

Serializable是一个标记,JRE / JVM可以根据其存在采取行动。

http://en.wikipedia.org/wiki/Marker_interface_pattern

Serializable不包含任何方法,它是可以通过writeObjectreadObject方法完成的ObjectOutputStreamObjectInputStream类。

Serializable只是一个标记接口,换句话说它只是放置一个标志,而不需要任何字段或方法。

Serializable接口是一个标记接口,它只通知JVM某个对象被设置为序列化。 序列化过程在内部发生。

一个更好的设计本来就是

 interface Serializable void writeObject(ObjectOutputStream out) void readObject(ObjectInputStream in) 

问题是,没有办法提供默认实现; 所以每个子类都必须实现这两种方法,这是一种麻烦。

 class MyClass implements Serializable // stupid boilerplate code void writeObject(ObjectOutputStream out) { Util.defaultWriteObject(this, out); } 

在Java 8中,这将会改变,我们可以为接口方法提供默认的impls

 interface Serializable void writeObject(ObjectOutputStream out) default Util::defaultWriteObject void readObject(ObjectInputStream in) default Util::defaultReadObject 

Serializable不会更改,但新function可用于类似情况)

我同意不可信的 ,特别是隐含的断言,即每个对象都应该知道如何序列化/反序列化自己,除了他/她的断言:

没有办法提供默认的implementsckquote

当然有: 对象组合 。

如果您看到ObjectOutputStream的writeObject方法的实现,那么您将在实现中看到以下代码片段。

在这里你可以看到,如果你的类没有实现Serializable接口,那么抛出NotSerializableException。

 if (obj instanceof String) { writeString((String) obj, unshared); } else if (cl.isArray()) { writeArray(obj, desc, unshared); } else if (obj instanceof Enum) { writeEnum((Enum) obj, desc, unshared); } else if (obj instanceof Serializable) { writeOrdinaryObject(obj, desc, unshared); } else { if (extendedDebugInfo) { throw new NotSerializableException( cl.getName() + "\n" + debugInfoStack.toString()); } else { throw new NotSerializableException(cl.getName()); } } 

Serializable只是一个标记界面。 Java内部使用它来检查对象是否实际可写。