package p1;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;
public class SerializationCheck {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
SingletonCompanyCEO s1 = SingletonCompanyCEO.getSingleObject();
SingletonCompanyCEO s2 = SingletonCompanyCEO.getSingleObject();
System.out.println("s1==s2:"+(s1==s2));
ObjectOutputStream obs = new ObjectOutputStream(new FileOutputStream("file.txt"));
obs.writeObject(s1);
//first read from file
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.txt"));
SingletonCompanyCEO ceo = (SingletonCompanyCEO)ois.readObject();
//second read from file
ois = new ObjectInputStream(new FileInputStream("file.txt"));
SingletonCompanyCEO ceo1 = (SingletonCompanyCEO)ois.readObject();
System.out.println("ceo==ceo1:"+(ceo==ceo1)+" (read from file ie. de-serialized)");
System.out.println(ceo1);
}
}
class SingletonCompanyCEO implements Serializable
{
public void setName(String name){
this.name = name;
}
public Object readResolve() throws ObjectStreamException {
return singleObject;
}
private static final long serialVersionUID = 1L;
private transient int age = 55; // age should set to zero by default as age is transient. But it is not happening, any reason?
private String name ="Amit";
float salary = 0f;
private static SingletonCompanyCEO singleObject;
private SingletonCompanyCEO()
{
if(singleObject!=null)
{
throw new IllegalStateException();
}
}
public static SingletonCompanyCEO getSingleObject()
{
if(singleObject==null)
{
singleObject = new SingletonCompanyCEO();
}
return singleObject;
}
public String toString()
{
return name+" is CEO of the company and his age is "+
age+"(here 'age' is transient variable and did not set to zero while serialization)";
}
}
이 코드를 복사하여 이클립스 편집기에 붙여 넣으십시오. 'age'transient
변수가 직렬화 중에 기본적으로 0으로 설정되지 않은 이유는 무엇입니까?
직렬화에서는 직렬화 중에 transient 및 static 변수가 0 (또는 기본값)으로 설정됩니다.
역 직렬화 후 age = 0
대신 age = 55
이 발생합니다.
JLS에서 이유가 있어야합니다. 이게 뭐야?transient 변수의 상태가 싱글 톤 객체에 저장되는 이유는 무엇입니까?
동의합니다. 위의 코드를 실행 한 다음 s1 및 s2 참조 생성을위한 코드를 제거하고 객체 쓰기 코드도 제거합니다. 이제 우리는 객체를 포함하는 파일을 직렬화했습니다. 제거한 후 파일을 읽는 코드 만 있습니다. 이제는 객체가 생성되지 않는 것을 발견했습니다. 'null'은 파일을 읽은 후 반환됩니다. 이제 다시 readResolve()를 제거해보십시오. 그러면 객체가 생성되고 단일성 객체가 아닌 것을 알 수 있습니다. 이게 뭐야? – AmitG
@AmitG : 내 업데이트를 참조하십시오. –
확인. 동의하다. 그러나 readResolve() 메소드를 유지하면 객체가 파일에서 'null'이됩니다. 어때? JVM 당 인스턴스 만 가져올 수 있도록 Singleton 객체를 deserialize하는 방법은 무엇입니까? readResolve()를 유지하면 두 개의 객체가 만들어지고 readResolve()를 유지하지 않으면 객체가 만들어지지 않습니다. – AmitG