자바 직렬화-장단점, 사용 또는 피? [닫은]


20

직렬화는 Java에서 지속성을 위해 사용됩니다. 직렬화를 사용하여 몇 가지 개체를 유지하는 것이 좋습니다. 그러나 많은 수의 객체의 경우 ORM, 데이터베이스 등이 더 좋습니다. 직렬화는 소규모 작업에만 유용합니다. 내가 틀렸을 수도 있습니다. 비 직렬화 방법에 비해 직렬화의 장점은 무엇입니까? 언제 사용해야하고 언제 피해야합니까?

이 질문은 DZone 기사 가 Object Serialization Evil입니까?

그리고 이것들은 내 질문을 일으킨 선입니다.

Java와 해당 세션 객체를 보면 순수한 객체 직렬화가 사용됩니다. 애플리케이션 세션이 상당히 오래 지속된다고 가정하면 (최대 몇 시간) 객체 직렬화는 간단하고 잘 지원되며 Java 개념의 세션에 내장됩니다. 그러나 데이터 지속성이 더 오래 (몇 주 또는 몇 주) 지속되고 응용 프로그램의 새로운 릴리스에 대해 걱정해야하는 경우 직렬화는 빠르게 악의가됩니다. 훌륭한 Java 개발자가 알고 있듯이 세션에서도 객체를 직렬화하려면 1L이 아니라 실제 직렬화 ID (serialVersionUID)가 필요하며 Serializable 인터페이스를 구현해야합니다. 그러나 대부분의 개발자는 Java 직렬화 해제 프로세스의 실제 규칙을 모릅니다. 단순한 필드를 객체에 추가하는 것 이상으로 객체가 변경된 경우 직렬화 ID가 변경되지 않은 경우에도 Java가 오브젝트를 올바르게 직렬화 해제 할 수 없습니다. 갑자기 데이터를 더 이상 검색 할 수 없으므로 본질적으로 나쁩니다.

이제 이것을 읽는 개발자는이 문제가있는 코드를 절대 작성하지 않을 것이라고 말할 수 있습니다. 사실 일 수도 있지만 회사에서 더 이상 사용하지 않는 라이브러리 나 다른 개발자는 어떻습니까? 이 문제가 발생하지 않을 것이라고 보장 할 수 있습니까? 이를 보장하는 유일한 방법은 다른 직렬화 방법을 사용하는 것입니다.


언급 된 기사에서 구체적으로 질문 한 내용을 조금 더 확장 하시겠습니까?
gnat

@gnat-질문에 줄을 추가했습니다.
sky scraper

'뿐만 아니라'에 관한 부분은 1L정확하지 않습니다.
user207421

답변:


15

직렬화는 주로 두 가지 영역에서 사용됩니다.

  • 지속성의 프로토 타이핑

    거의 모든 객체 그래프를 신속하게 직렬화 가능하게 만들 수 있습니다. 빠른 개념 증명 또는 빠르고 더러운 응용 프로그램의 경우 실제 ORM 레이어 또는 기타 지속성 시스템을 설정하는 것보다 빠를 수 있습니다.

  • 거의 임의의 객체의 단기 저장 :

    예를 들어 응용 프로그램 서버는 직렬화를 사용하여 세션 정보를 유지하는 경향이 있습니다. 이는 세션의 값이 직렬화 가능한 한 거의 모든 유형이 될 수 있다는 장점이 있습니다.

거의 모든 다른 용도에서, 당신과 기사에서 언급 한 단점이 너무 큽니다. 정확한 형식을 안정적으로 유지하기가 어렵고, 클래스 변경으로 인해 직렬화 된 데이터를 쉽게 읽을 수 없게 만들 수 있습니다. 비 Java 코드로 데이터를 읽거나 쓰는 것은 거의 없습니다 불가능하다 (또는 최소한 필요한 것보다 훨씬 어렵다).

JAXB 및 유사한 기술은 유사한 기능을 비슷한 비용으로 제공하면서 일부 문제점을 줄입니다.


JAXB를 '저비용'이라고 부르지 않을 것입니다. 스키마를 작성해야합니다.
kevin cline

3
@ kevincline : JAXB를 사용하는 스키마가 필요하지 않으며 전적으로 선택 사항입니다 (원하는 경우 클래스에서 스키마를 생성 할 수도 있음). 또한 JAXB가 어떤 이유로 유용하지 않으면 XML Beans와 같은 많은 대안이 잘 작동합니다.
Joachim Sauer 2014 년

12

프로덕션에서 예기치 않은 오류가 발생한 경우 사후 분석을 허용하기 위해 객체 직렬화를 사용합니다. 계산 입력은 데이터 파일로 직렬화됩니다. 오류가보고되면 간단한 프로그램이 입력을 다시로드하고 디버거가 연결된 계산을 다시 실행할 수 있습니다. 또는 그루비 쉘을 사용하여 객체를 다시로드하고 원하는 경우 수정할 수 있습니다.

또한 직렬화를 사용하여 HTTP를 통해 Java 객체를 웹 서비스에 전달합니다. 텍스트와 직렬화하는 것보다 훨씬 쉽습니다. 단점은 클라이언트와 서버 설치를 함께 배포해야한다는 것입니다. 그러나 양쪽 끝을 제어하므로 문제가되지 않습니다.


3
흥미로운 유스 케이스입니다! "더 복잡한"시스템을 요구하기에는 너무 작으며 대부분의 단점은 적용되지 않습니다!
Joachim Sauer 2014 년

이제 POI를 사용하여보다 쉽게 ​​볼 수 있도록 Java 객체에서 스프레드 시트를 작성하는 사후 분석기를 작성했습니다. 이로 인해 많은 시간의 로그 파일 검사가 절약되었습니다.
케빈 클라인

7

비 직렬화 방법에 비해 직렬화의 장점은 무엇입니까?

Java 직렬화에는 몇 가지 장점이 있습니다.

  • 시스템에 내장 : 타사 도구, 라이브러리 또는 구성에 의존 할 필요가 없습니다.

  • 적어도 처음에는 이해하기가 비교적 간단합니다 .

  • 모든 개발자는 그것을 알고 있어야합니다. Java 개발자의 승인 여부에 관계없이 Java 객체 직렬화에 익숙 할 것입니다.

물론 단점이 있습니다.

  • 표준 Java 흐름을 우회합니다. 메모리를 할당하지만 생성자를 호출하지 않으므로 일시적인 필드가 초기화되지 않습니다. 필드는 소스 순서가 아닌 알파벳 순서로 초기화됩니다.

  • 공간 측면에서는 그리 효율적 이지 않지만 끔찍하지도 않습니다. 결과를 압축 할 수 있습니다.

  • 물체가 변할 때 예방 조치를 취하지 않으면 부서지기 쉽습니다 . 그리고 그때도.

언제 사용해야하고 언제 피해야합니까?

사용시 :

  • 배포 규모가 중요합니다. 시스템에 내장되어 있으므로 0 바이트가 추가됩니다.

  • 모든 액터는 호환되는 버전을 사용합니다.

  • 장기 저장은 문제가되지 않습니다.

언제 피하십시오 :

  • 위의 어느 것도 적용되지 않습니다.

3

겹치는 부분이 있지만 직렬화와 ORM / 데이터베이스는 다릅니다.

직렬화 된 개체는 지속 된 개체를 "해동"하고 데이터를 다시 채우는 데 필요한 모든 정보를 나타냅니다. ORM 및 데이터베이스는 데이터를 데이터베이스에 유지합니다. 클래스에는 ORM에 의해 데이터베이스에 저장되지 않은 정보 필드 (예 : 계산 필드)가있을 수 있습니다.

또한 직렬화와 ORM은 다른 문제를 해결합니다. 직렬화는 객체 그래프를 스트림 (메모리, 파일 시스템 등)에 유지하는 문제를 해결합니다. ORM은 정보 열을 데이터베이스 열에 매핑하고 개체 검색 및 인스턴스화와 검색 및 지연로드와 같은 기능을 제공합니다.

많은 양의 데이터를 처리하거나보고, 검색 / 조회,웨어 하우징 또는 기타 데이터베이스에 유용한 것들이 필요한 상황에서 데이터베이스에 데이터를 유지하려면 ORM을 사용하십시오. 데이터 구조의 표현을 디스크에 저장하려면 직렬화를 사용하십시오.


0

직렬화는 실제로 거의 사용되지 않습니다.

이미 언급했듯이 직렬화의 가장 일반적인 사용 사례는 세션 데이터베이스에 개체를 Blob으로 저장하는 것입니다. 세션은 수명이 짧은 경향이 있고 세션 데이터베이스는 임의의 객체를 관계형 모델에 매핑하는 방법에 대한 지식이없는 두 가지 이유로 잘 작동합니다.

Amazon 장바구니와 같이 장기간 보관해야하는 데이터의 경우 데이터베이스에 해당 데이터를 저장하는 것이 가장 좋습니다.

세션 지속 메커니즘은 활성 세션을 가진 사용자가 동일한 서버로 리턴되도록합니다. 세션 데이터베이스는 서버가 실패하고 사용자가 새 서버로 리디렉션 될 때만 액세스됩니다. 새 서버는 활성 세션을 감지하지만 메모리에서 찾지 못하므로 사용자에게 완벽한 경험을 제공하기 위해 세션 데이터베이스에서 검색을 시도합니다.

이 방법에는 두 가지 문제가 있습니다.

먼저, 세션 데이터를 세션 데이터베이스로 플러시하는 것은 느린 프로세스입니다. 세션 데이터를 플러시하면 성능이 저하되는 경우가 많으며 대부분의 서버는 30 초 또는 1 분 이상 플러시하도록 구성되어 있습니다. 이 "상당한"장애 조치 솔루션은 결코 100 % 효과적이지 않습니다.

둘째, 내 경험에 따르면 대부분의 고객은 서버가 실패하는 드문 인스턴스 중에 사용자에게 로그인하고 다시 시도하라는 오류 메시지를 던지는 데 동의합니다. 이 경우 세션 데이터베이스를 완전히 끄고 성능을 향상시킵니다.

직렬화의 또 다른 용도는 서버-클라이언트 상호 작용을 위해 객체 그래프의 직렬화 및 압축을 사용하는 Flex와 같은 프레임 워크를 사용하여 응답 시간을 단축하는 것입니다.

다른 사람들이 지적했듯이 직렬화를 사용해야하는 창의적이고 유용한 이유가 있지만 실제로는 드 rare니다.

역사적으로 직렬화는 올바르게 구현하기가 어렵고 안정성이 떨어 지므로 소수의 사례로 사용이 제한됩니다. 대부분의 개발자는 객체 자체를 직렬화하지 않지만 뒤에서 수행하는 프레임 워크에 의존 할 수 있습니다.


2
"직렬화는 실제로 거의 사용되지 않습니다." -직렬화는 종종 REST 웹 서비스의 세계에서 호출됩니다. 대부분의 경우 하나는 문자열 및 정수 등을 처리하지만 실제로는 더 복잡한 객체에 대한 인식이 필요합니다. 거의 사용되지 않는다는 말은 자주 사용하는 많은 도메인을 무시합니다.

0

"Java 직렬화를 사용할 때"및 "Java 직렬화를 피할 때"에 대한 짧은 대답

다음과 같은 경우 Java 직렬화를 사용하십시오.

  • 코딩이 거의 필요하지 않습니다
  • 바이너리 데이터가 사람이 읽을 수 없다는 것은 중요하지 않습니다.
  • 직렬화 된 데이터를 검색 할 필요는 없습니다 (데이터베이스와 같은 쿼리는 불가능합니다)
  • 어느 한 쪽
    • 직렬화 된 데이터 구조가 변경되지 않거나
    • 더 이상 "데이터 구조 변경"후에 저장된 직렬화 된 데이터를 읽을 수없는 경우 (예 : 웹 앱의 세션 데이터) 중요하지 않습니다.

다른 모든 상황에서는 "이진 Java 직렬화"가 잘못되었습니다.

대안

  • xml 직렬화
  • nosql 데이터베이스
  • ORM과의 관계형 데이터베이스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.