물체를 수화시키는 것은 무엇을 의미합니까?


204

누군가 수분을 공급하는 것에 대해 이야기 할 때, 그것은 무엇을 의미합니까?

웹에서 Hydrate라는 Java 프로젝트를보고 다른 표현간에 데이터를 변환합니다 (RDMS에서 OOPS에서 XML로). 이것이 객체 수화의 일반적인 의미입니까? 표현간에 데이터를 변환하기 위해? 저장된 표현에서 객체 계층 구조를 재구성하는 것을 의미 할 수 있습니까?


3
또한이 질문을 참조하십시오. 대답이 있습니다. 그것은 똑같은 질문이 아니므로 닫으려고 투표하지 않습니다. 그러나 그것은 수화를 잘 설명합니다 : stackoverflow.com/questions/4929243/…
Erick Robertson

답변:


124

보다 일반적인 용어 수화물 과 관련하여

개체 수화는 메모리에 존재하지만 아직 도메인 데이터 ( "실제"데이터)를 포함하지 않는 개체를 가져온 다음 도메인 데이터 (예 : 데이터베이스, 네트워크 또는 파일)로 채 웁니다. 체계).

이 답변에 대한 Erick Robertson의 의견 :

역 직렬화 == 인스턴스화 + 수화

블리 스터링 성능에 대해 걱정할 필요가없고 데이터 액세스 API 내부에있는 성능 최적화를 디버깅하지 않는 경우 수화를 명시 적으로 처리하지 않아도됩니다. 일반적으로 대신 역 직렬화를 사용하므로 코드를 적게 작성할 수 있습니다. 일부 데이터 액세스 API는이 옵션을 제공하지 않으므로 이러한 경우 수화 단계를 명시 적으로 호출해야합니다.

수화 개념에 대한 자세한 내용은 동일한 질문에 대한 Erick Robertson의 답변 을 참조하십시오 .

수화물이라는 Java 프로젝트 와 관련하여

이 프레임 워크에 대해 구체적으로 물었으므로 조사했습니다.

내가 알 수있는 한,이 프로젝트가 "수화물"이라는 단어를 매우 일반적인 의미로 사용하지 않았다고 생각합니다. 제목에서 "직렬화"의 대략적인 동의어로 사용됩니다. 위에서 설명한 것처럼이 사용법은 완전히 정확하지 않습니다.

참조 : http://en.wikipedia.org/wiki/Serialization

데이터 구조 또는 객체 상태를 [...]로 저장하고 나중에 동일하거나 다른 컴퓨터 환경에서 재구성 할 수있는 형식으로 변환.

Hydrate FAQ 에서 직접 그들의 이름 뒤에 이유를 찾을 수는 없지만 그들의 의도에 대한 단서가 있습니다. 라이브러리의 목적은 일반적인 사운드와 유사한 Hibernate 프레임 워크 와 유사하기 때문에 "수화물"이라는 이름을 선택했다고 생각 합니다.

Hibernate를 포함한 대부분의 ORM은 데이터베이스 내에서 두 번째로 고려해야 할 메모리 내 객체 모델 지향 접근법을 취한다. Hydrate 라이브러리는 대신 데이터베이스 스키마 중심의 접근 방식을 취하여 관계형 데이터 구조를 유지하고 프로그램이보다 깔끔하게 작동하도록합니다.

이 라이브러리의 이름과 관련하여 은유 적으로 말하면, 수화물 은 "사용할 수있는 무언가를 만드는 것"( 건조한 음식을 재수 화하는 것과 같은)과 같습니다 . 그것은 Hibernate 의 은유 적 반대이다 . 이것은 "겨울을 위해 무언가를 버리는 것"과 비슷하다 ( Animal Hibernation ).

내가 말할 수있는 한, 수화물 라이브러리의 이름을 결정하는 것은 일반적인 컴퓨터 프로그래밍 용어 "수화물"과 관련이 없었다.

일반적인 컴퓨터 프로그래밍 용어 "수화물"을 사용할 때, 성능 최적화는 일반적으로 동기 부여 (또는 기존 최적화 디버깅)입니다. 라이브러리가 개체가 데이터로 채워지는시기와 방법에 대한 세부적인 제어를 지원하더라도 타이밍과 성능은 이름이나 라이브러리 기능의 주요 동기가 아닌 것 같습니다. 라이브러리는 엔드-투-엔드 매핑 및 스키마 보존을 활성화하는 데 더 관심이있는 것 같습니다.


79
-1 수화 란 기존 개체에 데이터를 채우는 것을 말합니다. 직렬화의 동의어가 아닙니다.
Erick Robertson

20
역 직렬화의 동의어도 아닙니다. 역 직렬화는 직렬화 될 때 보유한 데이터로 오브젝트를 작성합니다. 수화 란 데이터로 개체를 채우는 방법을 나타냅니다. 미묘한 차이이지만 차이입니다. 예를 들어 객체를 부분적으로 직렬화 해제 할 수 없습니다. (적어도 표준 API는 아님)
Erick Robertson

5
우리는 모두 배우려고 노력하고 있습니다. 불필요하다고 생각되면 제거하고 토론에 감사합니다. 필자가 실제로 PHP와 관련하여 "수화"라는 용어를 사용했기 때문에 제 대답은 Java 중심이 아닙니다. "물체를 수화시키는 것은 무엇을 의미합니까?"라는 질문에 대한 답변 "기존 개체에 데이터를 채우는 것"입니다. 수화하기 전에 개체가 존재해야하므로 역 직렬화에는 해당되지 않습니다. deserialization == instantiation + hydration
Erick Robertson

2
죄송합니다. Merlyn Morgan-Graham이 답변에서 태그를 지정하는 데 문제가 있습니다. 저장하면 제거됩니다. 또한 직렬화 해제와 같은 팽창이 문제가됩니다. 출처가없는 클레임을 제거하기 위해 링크 된 Wikipedia 기사를 편집했습니다. 나에게 팽창시키는 것은 일종의 감압 루틴을 암시합니다. 직렬화 루틴은 압축과 직교합니다.
Erick Robertson

2
@ErickRobertson Side note : @foo포스트 작성자에게 응답 할 때 필요하지 않습니다.
Duncan Jones

230

수화 란 물체로 데이터를 채우는 과정을 말합니다. 아직 수화되지 않은 개체가 인스턴스화되어 데이터가있는 개체를 나타내지 만 아직 데이터가 개체에로드되지 않았습니다. 이것은 성능상의 이유로 수행되는 것입니다.

또한 수화라는 용어는 데이터베이스 또는 다른 데이터 소스에서 데이터를로드하기위한 계획을 논의 할 때 사용됩니다. 여기 몇 가지 예가 있어요.

일부 필드 만로드했지만 일부는로드하지 않은 경우 오브젝트가 부분적으로 수화되었다고 말할 수 있습니다. 다른 필드는 현재 작업에 필요하지 않기 때문에이 작업을 수행 할 수 있습니다. 따라서 사용하지 않을 때이 데이터를로드, 전송 및 설정하는 데 대역폭과 CPU 사이클을 낭비 할 이유가 없습니다.

또한 Doctrine과 같은 일부 ORM은 인스턴스화 될 때 오브젝트를 수화시키지 않고 해당 오브젝트에서 데이터에 액세스 할 때만 수화합니다. 이것은 사용하지 않을 데이터를로드하지 않는 데 도움이되는 방법 중 하나입니다.


7
+1; 이것은 Java 및 수화와 관련하여 내 것보다 더 완전한 대답입니다. 내 대답이 언급했듯이 여전히 일반 deserialization이라는 용어와 완전히 동의어이지만 ORM에서 가장 일반적으로 사용됩니다. ORM API는 종종 검색하는 데이터 세트를 제어 할 수 있기 때문에 사용자가 작성하는 각 쿼리에 대해 새 맵핑을 작성하지 않고 기존 오브젝트 맵핑을 재사용 할 수 있습니다. 이 Q & A가 용어에 관한 것이기 때문에 "게으른 로딩"에 대해 이야기하고 있다고 말할 수도 있습니다.
Merlyn Morgan-Graham

1
객체 추출에서 데이터를 가져 오는 반대 프로세스를 호출하는 것이 맞습니까? 객체에서 데이터를 추출합니다.
Oleg Abrazhaev

43

이 Merlyn가 언급 한 바와 같이 다소 중복 고장이지만, 내 경험으로는 의미 이 정확해야 할 때 유용한 단어입니다, 그래서 그것을 생성 / 인스턴스화하지 개체를 채우는 / 충전에.


5
나는 내 마음을 바꾸었고, 이제 나는이 대답이 이전의 대답보다 더 정확하다는 데 동의합니다. 그 이후로 답변을 편집했습니다 (답변이 수락되어 정확하기를 원하기 때문에). 이제 deserialization과 수화 (특히 deserialization == instantiation + hydration) 의 차이를 반영하기를 바랍니다 .
Merlyn Morgan-Graham

8

이것은 매우 오래된 질문이지만 다음 용어의 의미에 대해 여전히 혼란스러워하는 것 같습니다. 바라건대, 이것은 명확해질 것입니다.

수화 시키다

"데이터를 기다리는 객체가 수화되기를 기다리는 것"과 같은 설명을 보면 혼란스럽고 오해의 소지가 있습니다. 물체는 물건을 기다리지 않으며 수화는 물체로 데이터를 채우는 행위입니다.

JavaScript를 예로 사용 :

const obj = {}; // empty object
const data = { foo: true, bar: true, baz: true };

// Hydrate "obj" with "data" 
Object.assign(obj, data); 
console.log(obj.foo); // true
console.log(obj.bar); // true
console.log(obj.baz); // true

값을 추가하는 obj것은 "수화"입니다. 나는 Object.assign()이 예제에서 사용 하고 있습니다.

"직렬화"및 "직렬화 해제"라는 용어는 다른 답변에서도 언급되었으므로 다음은 이러한 개념의 의미를 수화로부터 명확하게하는 데 도움이되는 예입니다.

직렬화

console.log(JSON.stringify({ foo: true, bar: true, baz: true }));

역 직렬화

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.