2015-05-13 3 views
1
class A extends Serializable{ 
     public A(){} 
int x=0; 
     private final transient ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); 

    } 

несколько вопросов о десериализации: 1) Почему необходимо предоставить конструктор по умолчанию в случае сериализации? 2) Почему поле «блокировка» не инициализируется после десериализации?шаги десериализации в Java

EDIT: забыл добавить «переходный» в моем первоначальном post.Added это сейчас.

+0

' Serializable '- это интерфейс, поэтому он должен быть« реализует Serializable » –

+0

' 2) Почему поле «блокировка» не инициализируется после десериализации? », Потому что оно временное. – EpicPandaForce

+0

@ EpicPandaForce, замок не получает desrialized из-за его преходящей природы. Но почему он не «инициализируется» новым объектом? На самом деле я хотел понять шаги десериализации, из-за которых она не инициализируется? – pjain

ответ

1

1) Почему требуется предоставить конструктор по умолчанию в случае сериализации.

Это не требование. Или, по крайней мере, это не требование, если вы используете сериализацию, реализованную с использованием ObjectInputStream и ObjectOutputStream.

2) Почему поле «блокировка» не инициализируется после десериализации?

Он должен быть инициализирован ... если вы используете ObjectInputStream и ObjectOutputStream. Объект lock должен быть сериализован и затем десериализован.

(Если у вас есть случай, когда lock по-видимому, не инициализирован, то, пожалуйста, опубликовать SSCCE, чтобы показать, что происходит.)

я неправильно утверждал, что ReentrantReadWriteLock не сериализации ... Это ,

ОБНОВЛЕНИЕ в версии с transient. Поле lock для десериализованного экземпляра A будет null. Выражение инициализации в объявлении lock не выполняется.

Для получения дополнительной информации, пожалуйста, прочтите Java Object Serialization Specification.


Если вы используете какой-либо другой механизм сериализации, вам нужно сказать, что это такое.

1
  1. Не требуется
  2. Блокировка инициализируется ниже код делает печать инициализированную замок (Просто писать Объект B в массив байтов и чтения назад от него)

    public class B implements Serializable { 
        private int x = 0; 
        private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); 
    
        public static void main(String[] args) throws IOException, ClassNotFoundException { 
         ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
         try (ObjectOutput out = new ObjectOutputStream(bos)) { 
          out.writeObject(new B()); 
         } 
         catch (IOException e) { 
          e.printStackTrace(); 
          throw e; 
         } 
         byte[] bytes = bos.toByteArray(); 
    
         ByteArrayInputStream bis = new ByteArrayInputStream(bytes); 
         try (ObjectInput in = new ObjectInputStream(bis)) { 
          B b = (B) in.readObject(); 
          System.out.println(b.lock); 
         } 
         catch (IOException e) { 
          e.printStackTrace(); 
          throw e; 
         } 
         } 
        } 
    } 
    
Смежные вопросы