Как заблокировать сериализацию в Java?

Я только начинаю сериализацию Java: у меня есть одно упражнение, и мне нужно заблокировать сериализацию для любого класса, предполагается, что при попытке сериализации этого класса возникает исключение.

кто нибудь знает как это сделать?

4 ответа

Если вы добавите реализацию 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/ для хорошего введения в переопределение поведения сериализации по умолчанию.

Три пользовательских метода сериализации, которые вы хотите предоставить: 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();
}

Небольшая хитрость (хотя на самом деле это не указано в спецификации) - вызвать NPE, когда система пытается создать соответствующий java.io.ObjectStreamClass, Я <3 nulls.

private static final ObjectStreamField[] serialPersistentFields = { null }

С 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 с подписью выше, и выбросить исключение.

Сериализация доступна только для классов, которые реализуют Serializable (прочитайте документы этого интерфейса). Я не думаю, что вы можете включить его во время выполнения. Если вы не хотите, чтобы объекты были сериализуемыми, не заставляйте их реализовывать Serializable,

Если сериализация находится под вашим контролем (т.е. вы звоните ObjectOutputStream.writeObject(..)), затем просто сделайте опцию конфигурации, которая запретит этот вызов.

Другим вариантом будет реализация writeObject(ObjectOutputStream out) метод и выбрасывать исключение в зависимости от параметра конфигурации.

Другие вопросы по тегам