[연재의 개념]
직렬화는 객체 상태를 지속 가능하거나 전송 가능한 형식으로 변환하는 프로세스입니다. 직렬화의 반대는 스트림을 개체로 변환하는 역직렬화입니다. 이 두 프로세스가 결합되어 데이터를 쉽게 저장하고 전송할 수 있습니다.
객체의 상태 정보를 저장하거나 전송할 수 있는 형태로 변환하는 과정입니다. 직렬화 중에 객체는 현재 상태를 임시 또는 영구 저장소에 씁니다. 나중에 저장소에서 개체의 상태를 읽거나 역직렬화하여 개체를 다시 만들 수 있습니다.
일반적으로 객체 인스턴스의 모든 필드는 직렬화됩니다. 즉, 데이터가 인스턴스의 직렬화된 데이터로 표시됩니다. 이렇게 하면 형식을 해석할 수 있는 코드가 멤버의 접근성에 의존하지 않고 이 데이터의 값을 결정할 수 있습니다. 마찬가지로 역직렬화는 직렬화된 표현에서 데이터를 추출하고 접근성 규칙에 관계없이 객체 상태를 직접 설정합니다. 중요한 보안 데이터를 포함할 수 있는 모든 개체는 가능하면 직렬화할 수 없도록 만들어야 합니다. 직렬화 가능해야 하는 경우 직렬화할 수 없는 중요한 데이터를 보유하는 특정 필드를 생성해 보십시오. 이것이 가능하지 않은 경우 데이터가 직렬화 권한이 있는 모든 코드에 노출된다는 점을 인식하고 악성 코드가 해당 권한을 얻지 못하도록 해야 합니다.
[JSON 개념]
JSON, JavaScript Object Notation은 인터페이스(AJAX, REST 등) 데이터 교환을 위한 더 가볍고 친숙한 형식입니다. JSON은 구조화된 데이터를 직렬화하기 위한 텍스트 형식으로, 클라이언트와 서버 간의 데이터 교환 페이로드를 나타내는 데 사용됩니다. ECMAScript 언어 표준에서 파생되었습니다. JSON의 디자인 목표는 JSON을 작고, 가볍고, 텍스트로 만들고, JavaScript의 하위 집합으로 만드는 것입니다.
【길이 비교】
다음 코드는 배열과 객체를 인코딩한 후 생성된 문자열과 그 길이를 보여줍니다
공개 $int = 1;
공개 $bool = TRUE;
공개 $array = array(array(1), 2 => 'test', 'string');
공개 함수 테스트($flag) {
echo $flag, 'Foo에 대한 테스트 함수
';
}
공개 정적 함수 출력($str) {
echo $str, '
';
}
공개 정적 함수 Compare_serialize_and_json($data) {
$serialize_str = serialize($data);
self::output('직렬화된 값:' . $serialize_str . "; length=" .
strlen($serialize_str));
$json_str = json_encode($data);
self::output('JSON 이후의 값:' . $json_str . "; length=" . strlen($json_str));
}
}
$test_data = array('wwww' => 0, 'phppan' => 1, 'com' => 2);
//직렬화된 배열
echo '배열:
';
Foo::compare_serialize_and_json($test_data);
$foo = new Foo();
echo 'Object:
';
Foo::compare_serialize_and_json($foo);
출력:
명백한 길이 차이, 인코딩 후 직렬화는 json보다 약 두 배 더 깁니다.
이유:
•직렬화 후 문자열에는 하위 문자열의 길이가 포함됩니다. 이는 일반적인 시공간 최적화일 수 있지만 여전히 너무 무겁습니다.
•Serialize에는 더 자세한 유형 구분이 있는 반면 json에는 4가지 유형만 있으며 간단한 기호로 표시됩니다.
【속도 비교】
코드로 문제를 설명합니다. 다음 코드는 속도를 비교합니다.
echo '직렬화:
';
$start = xdebug_time_index();
for ($i = 0; $i < $max_index; $i ) {
$ str = serialize($array);
}
$end = xdebug_time_index();
echo $end - $start, '
';
echo 'json:
';
$start = xdebug_time_index();
for ($i = 0; $i < $max_index; $i ) {
$ str = json_encode($array);
}
$end = xdebug_time_index();
echo $end - $start, '
';
unset($array, $ str);
출력:
데이터 양이 많을 경우 직렬화 속도는 json보다 훨씬 빠릅니다.
위의 두 가지 점에서 속도와 생성되는 문자열의 크기 측면에서 json이 직렬화보다 나은데 직렬화가 여전히 존재하는 이유는 무엇입니까? 그 이유는 구현된 기능에 있습니다.
【처리 대상】
다음 코드:
$foo = 새로운 Foo();
echo '역직렬화 테스트:
';
$foo->test(1);
$serialize_str = serialize($foo);
$obj = unserialize($ serialize_str);
$obj->test(2);
$foo->test(1);
$json_str = json_encode($foo);
$obj = json_decode($json_str);
$obj->test(2);
죽음();
출력:
( ! ) 치명적인 오류: 정의되지 않은 메서드 stdClass::test() 호출
json은 객체 메소드와 같은 데이터를 처리할 수 없습니다.
【사용범위】
•직렬화, 특히 개체 저장소의 경우 직렬화를 사용합니다. 이것이 존재의 의미입니다.
•Json은 큰 숫자가 포함된 배열 등 객체 독립적인 데이터 저장에 사용될 수 있습니다. 하지만 이런 상황에 직면했을 때 우리가 해야 할 일은 데이터베이스를 재구성하는 것일 수도 있습니다.
•JSON은 데이터 교환에 사용되며, 여기에 정의가 있습니다.
•현재 JSON은 UTF-8로 인코딩된 데이터에 사용할 수 있습니다.