2017-12-21 33 views
5

수중 음파 탐지기는응용 프로그램에서 객체 ID를 사용하지 않는 경우 Value 기반 객체를 serialize하는 것이 좋습니까?

만들기가이 클래스의 직렬화에 포함되지 않도록이 값 기반의 필드 과도를 보여줍니다.

이는 가치 기반 클래스가 출시 될 때 미래 보장 버그입니다.

그래서 응용 프로그램이 객체 ID에 의존하지 않으면 가치 기반 객체를 비 일시적으로 만들 수 있습니까?

답변

6

값 기반 클래스의 필드를 비 일시적으로 만들려면 값 기반 클래스를 직렬화 할 수 있어야합니다. 그래서 그것은 실제로 당신이하지 않은 디자인 결정입니다.

디자이너가 클래스를 값 기반으로 선언하고 Serializable을 구현하는 경우 값 기반 클래스와 직렬화가 호환되며 그대로 유지 될 것이라고 가정합니다.

최종 값 유형 구현은 어떻게 보이지만 JRE 개발자가 제공하는 마이그레이션 경로 (예 : 사양을 넘어 추가 규칙 및 제약 조건이 있다고 가정하기보다는 도입하여 the immutable lists, being value based and serializable을 가져와야합니다.

결국, 직렬화가 값 유형과 작동하지 않는다고 가정 할 이유가 없습니다. 원시 값도 지원하며 과거에도 적용되었습니다 (예 : enum 지원이 추가 된 경우 항상 값을 저장할지 또는 일반 오브젝트와 같은 참조를 계속 지원할지 또는 전혀 다른 정규화를 수행할지 여부는 명확하지 않지만 전제와 마찬가지로 오브젝트 ID에 의존하지 않는 한 두 가지 전략 중 하나가 코드에서 작동하는 것처럼 안전한 측면입니다.

+0

내 작은 두뇌는 이것을 소화하지 않기 때문에 기본적으로 우리는 이것들이 값 유형이고 그것들은 ('=='를 통해) 자신의 신원에 의존하지 않고 대신 equals를 사용한다고 구현 하는가? – Eugene

+3

@Eugene : 항상'=='대신'equals'을 사용하면 일반적으로 값 유형에 적용됩니다. 이제 Serialization은 이미 발생한 객체에 대한 역 참조를 사용하여 ID를 저장하고 복원하지만 값 유형에는 식별되지 않은 ID가 있으므로이 값에 의존해서는 안됩니다. 이후 버전은'writeUnshared'를 사용하는 것처럼 동작 할 수도 있지만 그 반대도 가능합니다. 같은 값이 동일한 인스턴스가 될 수도 있습니다 (여전히 객체라고 가정 할 경우) ... – Holger

+0

이 직렬화 문제를 읽는 3AM까지 유지해 주셔서 감사합니다 (if 오직 SO 만 내 청구서를 직접 지불 할 수 있습니다 ...). 그래서 두 개의 인스턴스 ('equals'이지만'==')가 아닌'Optional' 인스턴스를 직렬화하면 오늘 두 개의 다른 인스턴스를 작성하게 될 것입니다. 가치 유형 세계에서 나는 단지 하나의 글을 쓸 것입니다. 그러나 그들은 불변이므로 왜 이것이 중요할까요? 두 번의 후속 쓰기의 writeObject를 통해 "잃어버린 업데이트"를 얻을 수있는 것과는 다릅니다. 나는 여기서 어떤 의미가 있기를 바란다. – Eugene