Как заблокировать сериализацию в 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 null
s.
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)
метод и выбрасывать исключение в зависимости от параметра конфигурации.