Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建标记接口并序列化对象_Java_Marker Interfaces - Fatal编程技术网

Java 创建标记接口并序列化对象

Java 创建标记接口并序列化对象,java,marker-interfaces,Java,Marker Interfaces,我在Decompiler中看到了像serializable这样的标记接口,以及像objectInputStream和objectOutputStream这样的类。我的问题是我们可以创建自己的标记接口吗 如果是的话,那么我想做一些特别的事情,比如说我还想通过我的接口,通过相同的序列化机制来序列化对象 我交叉检查的是,在objectOutputStream中,他们正在writeobject()下检查操作符的实例 请告诉我如何创建marker接口,以及如何创建自己的类来实现我的marker接口并执行序

我在Decompiler中看到了像
serializable
这样的标记接口,以及像
objectInputStream
objectOutputStream
这样的类。我的问题是我们可以创建自己的标记接口吗

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

我交叉检查的是,在
objectOutputStream
中,他们正在
writeobject()下检查操作符的实例


请告诉我如何创建marker接口,以及如何创建自己的类来实现我的marker接口并执行序列化的特殊处理?

marker接口是指任何未定义任何方法或常量的接口,因此实现接口的唯一原因是“标记”从某种程度上讲,这门课很有趣。这样的接口可以这样定义和使用:

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

// MyClass.java
public class MyClass implements MyMarker { ... }
但这与序列化无关

如果需要自定义序列化处理,可以在类中实现
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 方法可以恢复它。该方法本身不需要考虑 属于对象的超类或子类的状态。陈述 通过将各个字段写入ObjectOutputStream来保存 使用writeObject方法或使用primitive的方法 DataOutput支持的数据类型


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

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

// MyClass.java
public class MyClass implements MyMarker { ... }
但这与序列化无关

如果需要自定义序列化处理,可以在类中实现
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 方法可以恢复它。该方法本身不需要考虑 属于对象的超类或子类的状态。陈述 通过将各个字段写入ObjectOutputStream来保存 使用writeObject方法或使用primitive的方法 DataOutput支持的数据类型


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

public interface MyMarkerInterface {
}
您可以像实现任何其他接口一样实现它:

public class MyClass implements MyMarkerInterface {
    ...
}

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

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

public interface MyMarkerInterface {
}
您可以像实现任何其他接口一样实现它:

public class MyClass implements MyMarkerInterface {
    ...
}

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

我也检查了此链接。我想您已经回答了自己的问题了?制作一个没有方法的接口,实现它,用
instanceof
检查它。你在问什么?我也检查了这个链接。我想你已经回答了你自己的问题了?制作一个没有方法的接口,实现它,用
instanceof
检查它。你在问什么?我完全同意你的看法,但我是否应该检查一下机制的实例,如果我想对标记接口的实现进行一些特殊处理,我如何才能做到这一点?你不能通过添加标记接口来更改序列化机制。如果要自定义对象的序列化方式,请使用writeObject方法。以下是规范的相关部分:。但我怀疑你真的想这么做。编辑你的问题,告诉我们你真正想做什么。你的最终目标是什么?我希望发生一些事情,可能是控制台上简单的语句打印,或者任何类实现我的标记接口的时候发生的任何事情。请重复:序列化机制不关心你的标记接口。你不能让你的类实现一个序列化代码未知的接口,并且希望这个序列化代码在遇到一个类实现这个接口的对象时神奇地打印出一些东西。如果您想自定义对象的序列化方式,请使用writeObject。为了更好地理解,您能否详细解释一下显示一小段代码?我完全同意您的意见,但我是否应该检查一下mechanism的实例,以及如果我想对marker interface的实现进行一些特殊处理,我将如何实现不能通过添加标记接口来更改序列化机制。如果要自定义对象的序列化方式,请使用writeObject方法。以下是规范的相关部分:。但我怀疑你真的想这么做。编辑你的问题,告诉我们你真正想做什么。你的最终目标是什么?我希望发生一些事情,可能是控制台上简单的语句打印,或者任何类实现我的标记接口的时候发生的任何事情。请重复:序列化机制不关心你的标记接口。你做不到