이미 직렬화 된 클래스를 직렬화 할 수 없습니까?

니힐 쿠 리아 코세

아래 스니퍼 참조

    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;
}

왜 그렇게 이상한 행동입니까?

chrylis-조심스럽게 낙관적-

귀하의 책은 잘못되었으며 serialVersionUID정적 인은 클래스 자체의 다른 버전을 처리하기위한 것입니다.

직렬화의 아이디어는 라이브 객체 (에서 가리키는 객체)를 가져와 usPresident모든 상태를 외부 형식 (바이트, XML, JSON)으로 저장하는 것입니다. 그런 다음 해당 상태를 개체의 복사본으로 되돌릴 수 있습니다. 워드 프로세서에 파일을 저장하는 것과 같습니다.

그러나 직렬화 한 후 개체를 수정하면 연결이 없습니다. 이미 디스크에 바이트를 썼으며 개체에 대한 메서드를 호출하기 때문에 변경되지 않습니다. 해당 바이트에서 개체를 다시 만들면 저장할 때와 동일한 값을 갖게됩니다. 워드 프로세서 문서에 변경 사항을 저장하는 것을 잊은 경우 디스크의 파일에는 여전히 이전 내용이 있습니다.

귀하의 경우 동일한 객체를 동일한 .NET 파일에 여러 번 작성하기 때문에 Java 직렬화에서 기이 한 문제가 발생했습니다 ObjectOutputStream. 복잡한 개체 관계를 직렬화 할 수 있도록 Java 직렬화는 개체를 한 번만 저장 한 다음 다시 저장할 때 다시 연결합니다. 스트림을 닫았다가 다시 열면 업데이트 된 값이 표시됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이미 직렬화 된 클래스를 직렬화 할 수 없습니까?

분류에서Dev

C ++ MFC에서 이진 직렬화 된 개체를 C #에서 역 직렬화 할 수 있습니까?

분류에서Dev

내 클래스 개체를 직렬화 할 수 없습니다.

분류에서Dev

스프레이 json 중첩 클래스를 역 직렬화 할 수 없음

분류에서Dev

Dlib에서 학습 된 함수를 직렬화 할 수 없음

분류에서Dev

파이썬 클래스 객체는 직렬화 할 수 없습니다.

분류에서Dev

JsonUtility로 데이터를 역 직렬화 할 수 없습니다.

분류에서Dev

공개 키를 직렬화 할 때 "키 데이터를 역 직렬화 할 수 없습니다"

분류에서Dev

json4s는 mixin 특성으로 케이스 클래스를 직렬화 할 수 없습니다.

분류에서Dev

데이터 클래스의 post_init 메서드에 정의 된 변수를 직렬화 할 수 있습니까?

분류에서Dev

클래스를 직렬화 할 수있을 때 작업을 직렬화 할 수 없음

분류에서Dev

Redis는 DataContract로 표시된 클래스를 직렬화 할 수 없다고 말합니다.

분류에서Dev

이전에 직렬화 된이 객체를로드 할 수없는 이유는 무엇입니까?

분류에서Dev

object` ( "[object Response]")를 JSON으로 직렬화 할 수 없습니까?

분류에서Dev

클래스에 중첩 된 메서드를 사용하여 "직렬화 할 수없는 작업"방지

분류에서Dev

io 모듈로 미니 돔 트리를 직렬화 할 수 없습니다.

분류에서Dev

JSP처럼 Gson의 메소드에 의해 반환 된 데이터를 직렬화 할 수 있습니까?

분류에서Dev

PHP로 jQuery 데이터를 직렬화 해제 할 수 없음

분류에서Dev

인터페이스로 형식을 역 직렬화 할 수 없습니다.

분류에서Dev

클래스가 직렬화 가능을 확장 할 때 Apache Spark 작업을 직렬화 할 수 없음

분류에서Dev

OData는 null 리소스를 직렬화 할 수 없습니다.

분류에서Dev

servicestack MsgPack 클라이언트를 사용할 때 서비스 응답을 역 직렬화 할 수 없습니다.

분류에서Dev

Type []이 객체에 래핑 된 경우에만 직렬화 할 수있는 이유는 무엇입니까?

분류에서Dev

이 잭슨 XmlWrapper를 사용하여 클래스에서 두 번째 때 (변환) 미개봉 목록을 역 직렬화 할 수 없습니다

분류에서Dev

멤버가 직접 직렬화 할 수 없지만 str () 표현이있는 객체를 직렬화하는 방법은 무엇입니까?

분류에서Dev

파생 클래스에서 역 직렬화 할 수 없습니다.

분류에서Dev

직렬화에서 속성 이름 (자동 생성 클래스)을 어떻게 변경할 수 있습니까?

분류에서Dev

어떻게 파이썬에서 JSON를 직렬화 할 수 있습니까?

분류에서Dev

어떻게 직렬화 된 일반 목록으로 json 파일을 역 직렬화 할 수 있습니까?

Related 관련 기사

  1. 1

    이미 직렬화 된 클래스를 직렬화 할 수 없습니까?

  2. 2

    C ++ MFC에서 이진 직렬화 된 개체를 C #에서 역 직렬화 할 수 있습니까?

  3. 3

    내 클래스 개체를 직렬화 할 수 없습니다.

  4. 4

    스프레이 json 중첩 클래스를 역 직렬화 할 수 없음

  5. 5

    Dlib에서 학습 된 함수를 직렬화 할 수 없음

  6. 6

    파이썬 클래스 객체는 직렬화 할 수 없습니다.

  7. 7

    JsonUtility로 데이터를 역 직렬화 할 수 없습니다.

  8. 8

    공개 키를 직렬화 할 때 "키 데이터를 역 직렬화 할 수 없습니다"

  9. 9

    json4s는 mixin 특성으로 케이스 클래스를 직렬화 할 수 없습니다.

  10. 10

    데이터 클래스의 post_init 메서드에 정의 된 변수를 직렬화 할 수 있습니까?

  11. 11

    클래스를 직렬화 할 수있을 때 작업을 직렬화 할 수 없음

  12. 12

    Redis는 DataContract로 표시된 클래스를 직렬화 할 수 없다고 말합니다.

  13. 13

    이전에 직렬화 된이 객체를로드 할 수없는 이유는 무엇입니까?

  14. 14

    object` ( "[object Response]")를 JSON으로 직렬화 할 수 없습니까?

  15. 15

    클래스에 중첩 된 메서드를 사용하여 "직렬화 할 수없는 작업"방지

  16. 16

    io 모듈로 미니 돔 트리를 직렬화 할 수 없습니다.

  17. 17

    JSP처럼 Gson의 메소드에 의해 반환 된 데이터를 직렬화 할 수 있습니까?

  18. 18

    PHP로 jQuery 데이터를 직렬화 해제 할 수 없음

  19. 19

    인터페이스로 형식을 역 직렬화 할 수 없습니다.

  20. 20

    클래스가 직렬화 가능을 확장 할 때 Apache Spark 작업을 직렬화 할 수 없음

  21. 21

    OData는 null 리소스를 직렬화 할 수 없습니다.

  22. 22

    servicestack MsgPack 클라이언트를 사용할 때 서비스 응답을 역 직렬화 할 수 없습니다.

  23. 23

    Type []이 객체에 래핑 된 경우에만 직렬화 할 수있는 이유는 무엇입니까?

  24. 24

    이 잭슨 XmlWrapper를 사용하여 클래스에서 두 번째 때 (변환) 미개봉 목록을 역 직렬화 할 수 없습니다

  25. 25

    멤버가 직접 직렬화 할 수 없지만 str () 표현이있는 객체를 직렬화하는 방법은 무엇입니까?

  26. 26

    파생 클래스에서 역 직렬화 할 수 없습니다.

  27. 27

    직렬화에서 속성 이름 (자동 생성 클래스)을 어떻게 변경할 수 있습니까?

  28. 28

    어떻게 파이썬에서 JSON를 직렬화 할 수 있습니까?

  29. 29

    어떻게 직렬화 된 일반 목록으로 json 파일을 역 직렬화 할 수 있습니까?

뜨겁다태그

보관