>  기사  >  웹 프론트엔드  >  php_javascript 기술의 직렬화 및 json 사용 소개

php_javascript 기술의 직렬화 및 json 사용 소개

WBOY
WBOY원래의
2016-05-16 17:29:311122검색

[연재의 개념]

직렬화는 객체 상태를 지속 가능하거나 전송 가능한 형식으로 변환하는 프로세스입니다. 직렬화의 반대는 스트림을 개체로 변환하는 역직렬화입니다. 이 두 프로세스가 결합되어 데이터를 쉽게 저장하고 전송할 수 있습니다.

객체의 상태 정보를 저장하거나 전송할 수 있는 형태로 변환하는 과정입니다. 직렬화 중에 객체는 현재 상태를 임시 또는 영구 저장소에 씁니다. 나중에 저장소에서 개체의 상태를 읽거나 역직렬화하여 개체를 다시 만들 수 있습니다.

일반적으로 객체 인스턴스의 모든 필드는 직렬화됩니다. 즉, 데이터가 인스턴스의 직렬화된 데이터로 표시됩니다. 이렇게 하면 형식을 해석할 수 있는 코드가 멤버의 접근성에 의존하지 않고 이 데이터의 값을 결정할 수 있습니다. 마찬가지로 역직렬화는 직렬화된 표현에서 데이터를 추출하고 접근성 규칙에 관계없이 객체 상태를 직접 설정합니다. 중요한 보안 데이터를 포함할 수 있는 모든 개체는 가능하면 직렬화할 수 없도록 만들어야 합니다. 직렬화 가능해야 하는 경우 직렬화할 수 없는 중요한 데이터를 보유하는 특정 필드를 생성해 보십시오. 이것이 가능하지 않은 경우 데이터가 직렬화 권한이 있는 모든 코드에 노출된다는 점을 인식하고 악성 코드가 해당 권한을 얻지 못하도록 해야 합니다.

[JSON 개념]

JSON, JavaScript Object Notation은 인터페이스(AJAX, REST 등) 데이터 교환을 위한 더 가볍고 친숙한 형식입니다. JSON은 구조화된 데이터를 직렬화하기 위한 텍스트 형식으로, 클라이언트와 서버 간의 데이터 교환 페이로드를 나타내는 데 사용됩니다. ECMAScript 언어 표준에서 파생되었습니다. JSON의 디자인 목표는 JSON을 작고, 가볍고, 텍스트로 만들고, JavaScript의 하위 집합으로 만드는 것입니다.

【길이 비교】

다음 코드는 배열과 객체를 인코딩한 후 생성된 문자열과 그 길이를 보여줍니다

코드 복사 코드는 다음과 같습니다.

class Foo {

공개 $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);

출력:

코드 복사 코드는 다음과 같습니다.

배열:
직렬화된 값: a :3:{s:4:"wwww";i:0;s:6:"phppan";i:1;s:3:"com";i:2;} 길이=52
JSON 값 : {"wwww":0,"phppan":1,"com":2}; 길이=29
객체:
직렬화된 값:O:3:"Foo":3: {s:3: "int";i:1;s:4:"bool";b:1;s:5:"배열";a:3:{i:0;
a:1:{ i:0;i :1;}i:2;s:4:"test";i:3;s:6:"string";}}; 길이=111
JSON 이후 값:{"int ":1,"bool ":true,"배열":{"0":[1],"2":"test","3":"string"}}; 길이=63

명백한 길이 차이, 인코딩 후 직렬화는 json보다 약 두 배 더 깁니다.

이유:

•직렬화 후 문자열에는 하위 문자열의 길이가 포함됩니다. 이는 일반적인 시공간 최적화일 수 있지만 여전히 너무 무겁습니다.
•Serialize에는 더 자세한 유형 구분이 있는 반면 json에는 4가지 유형만 있으며 간단한 기호로 표시됩니다.

【속도 비교】

코드로 문제를 설명합니다. 다음 코드는 속도를 비교합니다.

코드 복사 코드는 다음과 같습니다.

$max_index = 10;
ini_set("memory_limit","512M");
$array = array_fill(0, 1000000, rand(1, 9999));

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

출력:

코드 복사 코드는 다음과 같습니다.

직렬화:
9.5371007919312
json:
1.4313209056854

데이터 양이 많을 경우 직렬화 속도는 json보다 훨씬 빠릅니다.

위의 두 가지 점에서 속도와 생성되는 문자열의 크기 측면에서 json이 직렬화보다 나은데 직렬화가 여전히 존재하는 이유는 무엇입니까? 그 이유는 구현된 기능에 있습니다.

【처리 대상】

다음 코드:

코드 복사 코드는 다음과 같습니다.

header("콘텐츠 유형: 텍스트/ html;charset =utf8");
class Foo {
public function test($flag) {
echo $flag, 'Foo에 대한 테스트 함수
';
}
}

$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);
죽음();

출력:

코드 복사 코드는 다음과 같습니다.

역직렬화 테스트:
1테스트 함수 Foo
Foo에 대한 2가지 테스트 함수
Foo에 대한 1가지 테스트 기능

( ! ) 치명적인 오류: 정의되지 않은 메서드 stdClass::test() 호출

json은 객체 메소드와 같은 데이터를 처리할 수 없습니다.

【사용범위】

•직렬화, 특히 개체 저장소의 경우 직렬화를 사용합니다. 이것이 존재의 의미입니다.
•Json은 큰 숫자가 포함된 배열 등 객체 독립적인 데이터 저장에 사용될 수 있습니다. 하지만 이런 상황에 직면했을 때 우리가 해야 할 일은 데이터베이스를 재구성하는 것일 수도 있습니다.
•JSON은 데이터 교환에 사용되며, 여기에 정의가 있습니다.
•현재 JSON은 UTF-8로 인코딩된 데이터에 사용할 수 있습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.