Javascript.RU

PHP-функция: serialize

Зависит от

Javascript:

function serialize( mixed_val ) {    // Generates a storable representation of a value
    // 
    // +   original by: Ates Goral (http://magnetiq.com)
    // +   adapted for IE: Ilia Kantor (http://javascript.ru)
 
    switch (typeof(mixed_val)){
        case "number":
            if (isNaN(mixed_val) || !isFinite(mixed_val)){
                return false;
            } else{
                return (Math.floor(mixed_val) == mixed_val ? "i" : "d") + ":" + mixed_val + ";";
            }
        case "string":
            return "s:" + mixed_val.length + ":\"" + mixed_val + "\";";
        case "boolean":
            return "b:" + (mixed_val ? "1" : "0") + ";";
        case "object":
            if (mixed_val == null) {
                return "N;";
            } else if (mixed_val instanceof Array) {
                var idxobj = { idx: -1 };
		var map = []
		for(var i=0; i<mixed_val.length;i++) {
			idxobj.idx++;
                        var ser = serialize(mixed_val[i]);
 
			if (ser) {
                        	map.push(serialize(idxobj.idx) + ser)
			}
		}                                       

                return "a:" + mixed_val.length + ":{" + map.join("") + "}"

            }
            else {
                var class_name = get_class(mixed_val);
 
                if (class_name == undefined){
                    return false;
                }
 
                var props = new Array();
                for (var prop in mixed_val) {
                    var ser = serialize(mixed_val[prop]);
 
                    if (ser) {
                        props.push(serialize(prop) + ser);
                    }
                }
                return "O:" + class_name.length + ":\"" + class_name + "\":" + props.length + ":{" + props.join("") + "}";
            }
        case "undefined":
            return "N;";
    }
 
    return false;
}

Примеры:

serialize(['Kevin', 'van', 'Zonneveld']);
'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'

serialize(3.14);
'd:3.14;'

serialize("foo");
's:3:"foo";'

serialize(true);
'b:1;'

serialize(new Object());
'O:6:"Object":0:{}'

serialize(new (function MyClass() {}));
'O:7:"MyClass":0:{}'

serialize(new (function MyClass() { this.prop = 42 }));
'O:7:"MyClass":1:{s:4:"prop";i:42;}'

serialize(new Array());
'a:0:{}'

serialize([1, 3]);
'a:2:{i:0;i:1;i:1;i:3;}'

serialize(undefined);
'N;'

serialize(null);
'N;'

serialize(NaN);
false;

serialize(Infinity);
false;

serialize(Array);
false;

serialize(function doit() {});
false;

serialize(/./);
false;


Автор: Илья Кантор, дата: 3 июля, 2008 - 16:41
#permalink

Thanks for your report.
Function is fixed and tested against IE7, Opera 9.5. Should also work in lower versions.


Автор: JovialLiX (не зарегистрирован), дата: 3 апреля, 2011 - 14:37
#permalink

У меня на сервере PHP, почему то не разбирает, то, что выдаёт эта функция. Я разобрался в чём проблема. Строка сериализованная через PHP с русскими символами выглядит так: s:12:"Вопрос", то есть на каждый символ уходит по 2 байта, а на каждый латинский по одному ( s:13:"ВопросD" ). Данный скрипт считает количество символов не разбирая кодировку. Я написал простую функцию:

function get_length(val){
	var counter = 0;
	for(i=0; val.length>i; i++)
		if( /[абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ]/.test(val[i]) )
			counter += 2;
		else counter++;
	return counter;
}

и поместил её вызов вот сюда:

return "s:" + get_length(mixed_val) + ":\"" + mixed_val + "\";";

Всё заработало. Возможно конечно, что это проблема наблюдается только у меня из-за специфики системы.
( Windows7+ZendServer+apache2 )


Автор: Ильдар Хайруллин (не зарегистрирован), дата: 21 августа, 2013 - 09:04
#permalink

У меня была такая же проблема, когда переводил сайт с Win-1251 на UTF-8. В первой кодировке каждому символу выделяется один байт, во второй — от одного до шести, по мере необходимости. Опытным путём выяснилось, что русские символы определяются двумя байтами. Пришлось вручную править файлы с сериализованными данными...


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
2 + 3 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum