Должен ли я использовать YAML или JSON для хранения данных Perl?
Я использую формат YAML с разумным успехом за последние 6 месяцев или около того.
Однако чистая реализация Perl анализатора YAML справедлива
суетливый, чтобы вручную написать читаемый файл и, по-моему,
раздражающие причуды, такие как требование новой строки в конце файла. Это также
гигантский медленный по сравнению с остальной частью моей программы.
Я размышляю над следующей эволюцией своего проекта, и я рассматриваю
используя вместо этого JSON (в основном строгий подмножество YAML, поскольку он превращается
вне). Но какой формат имеет наибольшую тягу и усилия сообщества в Perl?
Что представляется сегодня лучшим долгосрочным форматом для простых
данных в Perl, YAML или JSON и почему?
Ответы
Ответ 1
YAML против JSON - это нечто очень не урегулированное в Perl, и я признаю, что я, как правило, посередине этого. Я бы посоветовал, что либо собираюсь рассказать вам о том, как много тягот сообщества. Я бы принял решение, основанное на различных плюсах и минусах форматов. Я разбиваю различные параметры сериализации данных, например (я собираюсь в wiki сообщества, чтобы люди могли добавить к нему):
YAML Pros
- Дружелюбный человек, люди пишут основной YAML, даже не зная об этом.
- строки WYSIWYG
- Выразительный (имеет характер TMTOWDI)
- Расширяемая система типов/метаданных
- Типы данных, совместимые с Perl
- Портативный
- Знакомый (много синтаксиса inline и string выглядит как Perl-код)
- Хорошие реализации, если у вас есть компилятор (YAML:: XS)
- Хорошая возможность сброса данных Perl
- Компактное использование пространства экрана (возможно, вы можете отформатировать его в одну строку)
YAML Cons
- Большая спецификация
- Неверные/неполные чистые реализации Perl
- Пробел как синтаксис может быть спорным.
JSON Pros
- Возможность чтения/записи на человека
- Малая спецификация
- Хорошие реализации
- Портативный
- Синтаксис Perlish
- YAML 1.2 является надмножеством JSON
- Компактное использование экранного пространства
- Perl дружественные типы данных
- Много вещей обрабатывают JSON
JSON Cons
- Строки не WYSIWYG
- Без расширяемости
- Некоторые структуры Perl должны быть выражены ad-hoc (объекты и глобусы).
- Отсутствие выразительности
Преимущества XML
- Широкое использование
- Синтаксис, знакомый веб-разработчикам
- Большой корпус хороших модулей XML
- Schemas
- Технологии поиска и преобразования данных
- Портативный
Недостатки XML
- Задумчивый для людей читать и писать
- Структуры данных, чуждые Perl
- Отсутствие выразительности
- Большая спецификация
- Многословный
Perl/Data:: Dumper Pros
- Без зависимостей
- Удивительно компактный (с правильными флагами)
- Perl friendly
- Может сбрасывать что угодно (через DDS)
- Выразительный
- Компактное использование экранного пространства
- строки WYSIWYG
- Знакомый
Perl/Data:: Dumper Cons
- Не переносимый (на другие языки)
- Небезопасный (без героических мер)
- Непостижимый для программистов, не являющихся Perl
Сохраняемые профи
- Компактный? (у вас нет номеров для резервного копирования)
- Быстро? (у вас нет номеров для резервного копирования)
Сохраняемые минусы
- Человеческое враждебное
- Несовместим с сохраняемыми версиями
- Не переносимый (на другие языки)
Ответ 2
Как и в большинстве случаев, это зависит. Я думаю, если вам нужна скорость и интероперабельность (с другими языками), используйте JSON, в частности JSON:: XS.
Если вы хотите что-то, что когда-либо будет использоваться модулями Perl, придерживайтесь YAML. Это гораздо более распространено для поиска модулей Perl на CPAN, которые поддерживают описание данных с помощью YAML, или которые зависят от YAML, чем JSON.
Обратите внимание, что я не авторитет, и это мнение основано в основном на догадках и догадках. В частности, я не профилировал JSON:: XS vs. YAML:: XS. Если я оскорбительно неосведомлен, я могу только надеяться, что сделаю кого-то раздраженным, чтобы принести полезную информацию для обсуждения, исправив меня.
Ответ 3
Все о человеческой удобочитаемости, если это ваша главная проблема, выберите YAML:
YAML:
american:
- Boston Red Sox
- Detroit Tigers
- New York Yankees
national:
- New York Mets
- Chicago Cubs
- Atlanta Braves
JSON:
{
"american": [
"Boston Red Sox",
"Detroit Tigers",
"New York Yankees"
],
"national": [
"New York Mets",
"Chicago Cubs",
"Atlanta Braves"
]
}
Ответ 4
Реализация YAML pure-Perl (модуль YAML
в отличие от YAML::Syck
), похоже, имеет некоторые серьезные проблемы. Я недавно столкнулся с проблемами, когда он не мог обрабатывать документы YAML с очень длинными строками (32 тыс. Символов или около того).
YAML может хранить и загружать блаженные переменные и делает это
default (фрагмент ниже был скопирован из буфера *sepia-repl*
в
Emacs):
I need user feedback! Please send questions or comments to [email protected]
Sepia version 0.98.
Type ",h" for help, or ",q" to quit.
main @> use YAML
undef
main @> $foo = bless {}, 'asdf'
bless( {}, 'asdf' )
main @> $foo_dump = YAML::Dump $foo
'--- !!perl/hash:asdf {}
'
main @> YAML::Load $foo_dump
bless( {}, 'asdf' )
Это довольно страшно, потому что ненадежные данные могут быть использованы
для вызова любого метода DESTROY
, который был определен в вашем приложении
- или любой из модулей, которые он использует.
Следующая короткая программа демонстрирует проблему:
#!/usr/bin/perl
use YAML;
use Data::Dumper;
package My::Namespace;
sub DESTROY {
print Data::Dumper::Dumper \@_;
}
package main;
my $var = YAML::Load '--- !!perl/hash:My::Namespace
bar: 2
foo: 1
';
JSON не позволяет это по умолчанию - можно сериализовать
Perl "объекты", но для этого вам необходимо определить TO_JSON
Методы.
Ответ 5
если вы рассматриваете Обозначение объекта JavaScript, почему бы не использовать "Perl Object Notation"?
JSON:
{"name": "bob", "parents": {"mother": "susan", "father": "bill"}, "nums": [1, 2, 3]}
Perl:
{name => "bob", parents => {mother => "susan", father => "bill"}, nums => [1, 2, 3]}
Ответ 6
Вы также можете рассмотреть возможность использования Storable. Вероятно, вы получите очень хорошую скорость. Компромиссы:
- Сохраняемый формат двоичный и не читаемый человеком, как JSON или YAML
- Storable не является чистым модулем Perl (если это имеет значение)
Ответ 7
Я использую YAML для отслеживания состояния процессов, потому что я могу прочитать YML в середине процесса. Вы (технически) нуждаетесь в полностью сформированных документах для чтения XML или JS. YAML хорош для отслеживания статуса, потому что вы можете написать много мини-документов в файл. В противном случае я обычно использую XML или JS. Хорошее резюме плюсов и минусов выше, кстати.