아래 스니퍼 참조
USPresident usPresident = new USPresident(56);
try (ObjectOutputStream oos = new ObjectOutputStream(new
FileOutputStream("/home/nikhil/dev/USPresident.data"))){
oos.writeObject(usPresident);
usPresident.setTerm(57);
oos.writeObject(usPresident);
System.out.println("Serialized");
}
용어가 56 인 대통령 인스턴스를 생성했습니다. 직렬화했습니다. 용어를 57로 재설정하십시오.
그러나 객체를 역 직렬화해도 용어는 여전히 56 (57이 아닙니다!)
나는 내가 책에 주어진 설명을 본다.
예, setter를 사용하여 용어를 57로 변경하고 다시 직렬화하더라도 56을 인쇄합니다. 이는 직렬화시 JVM에서 확인하는 serialVersionUID로 인해 발생합니다. 클래스가 이미 직렬화되어 있고이를 다시 직렬화하려고하면 JVM이이를 직렬화하지 않습니다.
그러나 내 이해에 따르면 serialVersionUID는 직렬화 해제 중에 Class 객체가 직렬화 된 객체와 일치하는지 확인하는 데 사용됩니다. 또한 serialVersionUID는 상태가 아닌 개체 서명의 식별자로 사용됩니다.
여기서 무슨 일이 일어나고 있는지 이해하지 못합니다. 누군가이 행동을 설명 할 수 있습니까?
ObjectOutputStream의 구현을 살펴 봤고 이것이 writeObjet이 구현되는 방법입니다.
public final void writeObject(Object obj) throws IOException {
if (enableOverride) {
writeObjectOverride(obj);
return;
}
try {
writeObject0(obj, false);
} catch (IOException ex) {
if (depth == 0) {
writeFatalException(ex);
}
throw ex;
}
}
부울 enableOverride를 참조하십시오 . '수정 된'객체를 작성하려면 이것이 사실이어야합니다. 그러나 이것은 사용이 ObjectOutputStream을 서브 클래스하는 경우에만 true로 설정할 수 있습니다. 아래의 보호 된 생성자를 참조하십시오.
protected ObjectOutputStream() throws IOException, SecurityException {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
}
bout = null;
handles = null;
subs = null;
enableOverride = true;
debugInfoStack = null;
}
왜 그렇게 이상한 행동입니까?
귀하의 책은 잘못되었으며 serialVersionUID
정적 인은 클래스 자체의 다른 버전을 처리하기위한 것입니다.
직렬화의 아이디어는 라이브 객체 (에서 가리키는 객체)를 가져와 usPresident
모든 상태를 외부 형식 (바이트, XML, JSON)으로 저장하는 것입니다. 그런 다음 해당 상태를 개체의 복사본으로 되돌릴 수 있습니다. 워드 프로세서에 파일을 저장하는 것과 같습니다.
그러나 직렬화 한 후 개체를 수정하면 연결이 없습니다. 이미 디스크에 바이트를 썼으며 개체에 대한 메서드를 호출하기 때문에 변경되지 않습니다. 해당 바이트에서 개체를 다시 만들면 저장할 때와 동일한 값을 갖게됩니다. 워드 프로세서 문서에 변경 사항을 저장하는 것을 잊은 경우 디스크의 파일에는 여전히 이전 내용이 있습니다.
귀하의 경우 동일한 객체를 동일한 .NET 파일에 여러 번 작성하기 때문에 Java 직렬화에서 기이 한 문제가 발생했습니다 ObjectOutputStream
. 복잡한 개체 관계를 직렬화 할 수 있도록 Java 직렬화는 개체를 한 번만 저장 한 다음 다시 저장할 때 다시 연결합니다. 스트림을 닫았다가 다시 열면 업데이트 된 값이 표시됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다