如何在Java中锁定序列化?

如何在Java中锁定序列化?,java,serialization,Java,Serialization,我只是从Java序列化开始:我有一个练习要做,我需要在任何类上锁定序列化,当我尝试序列化该类时,它会抛出一个异常 有人知道怎么做吗?序列化仅适用于实现的类(请阅读此接口的文档)。我认为你不能在运行时切换它。如果不希望对象可序列化,请不要让它们实现serializable 如果序列化在您的控制范围内(即,您正在调用ObjectOutputStream.writeObject(..)),则只需设置一个不允许该调用的配置选项即可 另一个选项是实现的writeObject(ObjectOutputStr

我只是从Java序列化开始:我有一个练习要做,我需要在任何类上锁定序列化,当我尝试序列化该类时,它会抛出一个异常


有人知道怎么做吗?

序列化仅适用于实现的类(请阅读此接口的文档)。我认为你不能在运行时切换它。如果不希望对象可序列化,请不要让它们实现
serializable

如果序列化在您的控制范围内(即,您正在调用
ObjectOutputStream.writeObject(..)
),则只需设置一个不允许该调用的配置选项即可


另一个选项是实现的
writeObject(ObjectOutputStream out)
方法,并根据配置选项引发异常。

如果添加引发异常的
writeObject
实现,序列化将中止,例如

  private void writeObject(ObjectOutputStream stream) throws IOException {
    throw new RuntimeException("Don't want to serialize today");
  }
有关重写默认序列化行为的详细介绍,请参阅。

From

在序列化和反序列化过程中需要特殊处理的类必须使用以下精确签名实现特殊方法:


您可以始终尝试使用上面的签名重载
writeObject
,并引发异常。

您想要提供的三种自定义序列化方法是
writeObject
readObject
readObjectNoData
。要抛出的适当异常是适当命名的
java.io.NotSerializableException

private void writeObject(
    ObjectOutputStream out {
) throws IOException {
    throw new NotSerializableException();
}
private void readObject(
    ObjectInputStream in
) throws IOException, ClassNotFoundException {
    throw new NotSerializableException();
}
private void readObjectNoData( 
) throws ObjectStreamException {
    throw new NotSerializableException();
}

一个小技巧(尽管规范中没有实际指定)是在系统尝试创建匹配的
java.io.ObjectStreamClass
时导致NPE。我只针对一个类,或者您尝试序列化的任何类?谢谢您的回答,现在我想我了解了它是如何工作的。我建议抛出更具体的
UnsupportedOperationException
,而不是常规的
RuntimeException
private void writeObject(
    ObjectOutputStream out {
) throws IOException {
    throw new NotSerializableException();
}
private void readObject(
    ObjectInputStream in
) throws IOException, ClassNotFoundException {
    throw new NotSerializableException();
}
private void readObjectNoData( 
) throws ObjectStreamException {
    throw new NotSerializableException();
}
private static final ObjectStreamField[] serialPersistentFields = { null }