如何在Java中锁定序列化?

我刚开始使用Java序列化:我有一个练习要做,我需要锁定任何类的序列化,我想在我尝试序列化该类时抛出exception。

有谁知道怎么做?

如果添加一个抛出exception的writeObject实现,序列化将被中止,例如

  private void writeObject(ObjectOutputStream stream) throws IOException { throw new RuntimeException("Don't want to serialize today"); } 

有关覆盖默认序列化行为的详细介绍,请参见http://java.sun.com/developer/technicalArticles/ALT/serialization/ 。

来自http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html

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

 private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; 

您总是可以尝试使用上面的签名重载writeObject ,并抛出exception。

您要提供的三个自定义序列化方法是writeObjectreadObjectreadObjectNoData 。 抛出的适当exception是适当命名的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。 我<3 null s。

 private static final ObjectStreamField[] serialPersistentFields = { null } 

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

如果序列化在您的控件内(即您正在调用ObjectOutputStream.writeObject(..) ),那么只需创建一个禁止该调用的配置选项。

另一种选择是实现writeObject(ObjectOutputStream out)方法并根据配置选项抛出exception。