标记接口是一种具有运行时类型检查的设计模式,允许您将接口和类关联起来。要理解为什么这可能是必要的,请考虑使用标记来标记 Serializible 类的示例。假设我们需要将对象的状态保存在内存中,然后还能够解密我们保存的内容。然后,你说,我们可以将对象转换为一组位。正确的。我们可以使用 FileInputStream 来使用一种简单的方式写入文件,但这仅在对象很少的情况下才方便,但是如果对象很多怎么办?有一个很棒的序列化工具可以实现这一点。使用它时的主要规则是被序列化的对象必须包含所有数据并且不引用其他对象。看看你的类“啊哈,字段没有被引用,最好放置可序列化标记。” 当你放置它时,就意味着你标记的对象可以写入ObjectOutputStream。ObjectOutputStream 类有一个 writeObject0() 方法,它包含 instanceof 检查,检查对象是否可以写入,如果整个系列检查失败,则抛出 NotSerializedException 异常,如果没有,则所有内容都会整齐地写入内存。让我们创建一个 BigObject 类,我们将序列化它的实例。BigObject
package post1; import java.io.Serializable; public class BigObject implements Serializable { private int id; public void setId(final int id){ this.id = id; } public int getId() { return id; } }
类已经被标记为可序列化。它有一个 id 字段和附带的 get/set 方法。 package post1; import post1.BigObject; import java.io.*; public class InterfaceMarker { public static void main(String[] args) throws IOException, ClassNotFoundException { int originalId = 12; BigObject objectOriginal = new BigObject(); objectOriginal.setId(originalId); ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream(); ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer); outputStream.writeObject(objectOriginal); outputStream.close(); byte[] buffer = writeBuffer.toByteArray(); ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer); ObjectInputStream inputStream = new ObjectInputStream(readBuffer); BigObject objectCopy = (BigObject)inputStream.readObject(); if (objectCopy.getId() == originalId) System.out.println( "originalId equals copiedId"); } }
GO TO FULL VERSION