0

我已经看到了像serializabledecompiler 这样的标记接口以及像objectInputStreamand类这样的类objectOutputStream。我的问题是我们可以创建自己的标记界面吗?

如果是,那么我想做一些特别的事情说我也想序列化对象相同的序列化机制,但通过我的接口。

我交叉检查的是,objectOutputStream他们正在检查以下运算符的实例writeobject()

 else if ((paramObject instanceof Serializable)) {
        writeOrdinaryObject(paramObject, localObjectStreamClass, paramBoolean);
 }

请告诉我如何制作标记接口以及如何创建自己的类来实现我的标记接口并进行特殊的序列化处理?

4

2 回答 2

2

标记接口只是一个没有任何方法的普通接口:

public interface MyMarkerInterface {
}

您可以像任何其他接口一样实现它:

public class MyClass implements MyMarkerInterface {
    ...
}

也就是说,这不会改变此类实例的序列化方式。序列化机制不关心您的标记接口。它只检查对象是否可序列化(通过检查其类是否实现java.io.Serializable)。

于 2013-02-17T16:53:44.470 回答
1

标记接口是没有定义任何方法或常量的任何接口,因此实现接口的唯一原因是以某种方式“标记”类。这样的接口可以像这样定义和使用:

// MyMarker.java
public interface MyMarker { /* just a marker */ }

// MyClass.java
public class MyClass implements MyMarker { ... }

不过,这与序列化无关。

如果您需要对序列化进行自定义处理,您可以按照 ObjectOutputStream 中的说明在您的类中实现readObject和:writeObject

在序列化和反序列化过程中需要特殊处理的类必须实现具有这些确切签名的特殊方法:

private void readObject(java.io.ObjectInputStream stream)
   throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
   throws IOException
private void readObjectNoData()
   throws ObjectStreamException;  

writeObject 方法负责为其特定类写入对象的状态,以便相应的 readObject 方法可以恢复它。该方法不需要关注属于对象的超类或子类的状态。通过使用 writeObject 方法或使用 DataOutput 支持的原始数据类型的方法将各个字段写入 ObjectOutputStream 来保存状态。

于 2013-02-17T16:53:32.717 回答