https://wiki.shelek.ru/api.php?action=feedcontributions&user=Sel&feedformat=atomВесельчак У - Вклад участника [ru]2024-03-29T13:52:19ZВклад участникаMediaWiki 1.25.1https://wiki.shelek.ru/index.php?title=Tornado&diff=685Tornado2009-03-22T19:07:44Z<p>Sel: </p>
<hr />
<div>Каждый день Дух Тихой Гавани просыпался и принимался за работу. Осмотреть владения, собрать опавшие листики, поправить птичьи гнездышки, проследить, что творится в Пещерах, - много дел в Тихой Гавани. А вечером отдых - на мягких веточках, с кружкой чая в руке можно часами смотреть на океан. Можно поиграть со зверушками, а можно сходить в гости к другу, Духу Лесного Озера, с ним всегда есть о чем поговорить. Текла жизнь легко и непринужденно. Муза Пещеры готовила вкусные ужины, Дух Тихой Гавани любил сидеть в ее Пещере в свободное время. Беспокоила, правда, чета Пещерных Жителей с их Потомством, шумные они были, даже если не выходили из своей Пещеры, но Дух умел укрыться от них в своей любимой Пещерке.<br />
<br />
И вот однажды, теплым лентим днем залетело в Тихую Гавань молодое резвое Торнадо. Навело шуму, напугало птичек, переворошило деревья и расположилось, наконец, в шезлонге из веток. Влево и вправо распустило свои руки, напоминавшие ленточки, эти руки трогали все вокруг, на что Торнадо совершенно не обращало внимания.<br />
<br />
- Кто ты? - спросил Дух Тихой Гавани.<br />
<br />
- Я? Торнадо, - ответило Торнадо, бегая глазами по Гавани.<br />
<br />
- Ну и что ты тут натворило? - проворчал Дух Тихой Гавани.<br />
<br />
- Я? Ничего. Я принесло сюда жизнь, ты не заметил? <br />
<br />
Казалось, Торнадо веселило все вокруг: и переполох, и озабоченный Дух, и даже сам ясный день. Дух Тихой Гавани задумался и сел на соседнее дерево.<br />
<br />
- Ну и откуда ты?<br />
<br />
- Я живу на Маленьком Острове. Вместе с Духом Маленького Острова и Юным Торнадо.<br />
<br />
Торнадо рассмеялось. Духу Тихой Гавани стало интересно: он никогда раньше не видел торнадо. <br />
<br />
День пролетел незаметно, за ним второй, третий. Торнадо летало по всей Гавани, рассматривая, будоража все, что попадалось на пути. Дух Тихой Гавани еле успевал бежать следом. А вечером третьего дня Торнадо собралось улетать.<br />
<br />
- Тебе так хочется домой? - поинтересовался Дух. Он мало что знал о торнадо.<br />
<br />
- Меня ждут на Маленьком Острове. И у меня много дел, - сказало Торнадо и собрало руки-ленточки в кучку. Почему-то стало грустно.<br />
<br />
Дух уже знал, что Торнадо не нравилось на Маленьком Острове, что оно переживало, потому что недавно поссорилось с жителями Большой Лощины и теперь не могло летать туда.<br />
<br />
- Ты еще вернешься? - спросил Дух Тихой Гавани с тайной надеждой.<br />
<br />
- Если ты хочешь, вернусь, - Торнадо опять улыбалось, завязывая руки-ленточки бантиками, как будто стеснялось. Торнадо понравился Дух Тихой Гавани, но оно боялось привязаться к нему, потому что еще совсем недавно оно рассталось с Духом Соснового Бора и теперь тяжело переживало разрыв. Буря мыслей пронеслась в голове Торнадо, одна задержалась - "а может..?"<br />
<br />
- Было бы здорово, - сказал Дух.<br />
<br />
И Торнадо улетело. А Духу Тихой Гавани стало пусто и одиноко без шумного Торнадо. Он осмотрел Тихую Гавань. "Кажется, тут как раз не хватает Торнадо. Слишком тихо тут у меня", подумал Дух.<br />
<br />
День сменялся ночью, лето - осенью. Между Тихой Гаванью и Маленьким Островом непрерывно курсировали голуби - они носили почту Торнадо и Духа Тихой Гавани. Письма были большие, тяжелые. Только некогда было Торнадо летать в Тихую Гавань. Много дел было у Торнадо на Маленьком Острове и в окрестностях. <br />
<br />
И тогда решился Дух Тихой Гавани навестить Маленький остров, он никогда там не был. Да он вообще мало где был. И зачем? Есть ведь Тихая Гавань, где всегда спокойно и уютно. Только пообщавшись с Торнадо он понял, какой же мир большой и шумный. И как это здорово, когда ты едешь в гости к Торнадо.<br />
<br />
После встречи на Маленьком Острове Торнадо решило изменить привычную жизнь. Осмотрело оно Большую Землю рядом с Тихой Гаванью и стало местечко для себя там подыскивать. Но тут случилась размолвка у Торнадо и Духа Тихой Гавани. И впервые увидело Торнадо, что не так все гладко между ними: отказался Дух Тихой Гавани совет дать Торнадо, когда было нужно. И остановило Торнадо поиски местечка на Большой Земле, потому что задумалось.<br />
<br />
"На Маленьком Острове у меня есть домик, а что будет на Большой Земле? На Маленьком Острове есть у меня работа, а что будет на Большой Земле? И кто поможет мне, если Дух Тихой Гавани откажется?" <br />
<br />
Долго думало Торнадо, но все же помирилось с Духом Тихой Гавани. Снова полетели голуби, снова пустился Дух в гости на Маленький Остров...<br />
<br />
Шло время.</div>Selhttps://wiki.shelek.ru/index.php?title=Tornado&diff=684Tornado2009-03-22T19:03:24Z<p>Sel: </p>
<hr />
<div>Каждый день Дух Тихой Гавани просыпался и принимался за работу. Осмотреть владения, собрать опавшие листики, поправить птичьи гнездышки, проследить, что творится в Пещерах, - много дел в Тихой Гавани. А вечером отдых - на мягких веточках, с кружкой чая в руке можно часами смотреть на океан. Можно поиграть со зверушками, а можно сходить в гости к другу, Духу Лесного Озера, с ним всегда есть о чем поговорить. Текла жизнь легко и непринужденно. Муза Пещеры готовила вкусные ужины, Дух Тихой Гавани любил сидеть в ее Пещере в свободное время. Беспокоила, правда, чета Пещерных Жителей с их Потомством, шумные они были, даже если не выходили из своей Пещеры, но Дух умел укрыться от них в своей любимой Пещерке.<br />
<br />
И вот однажды, теплым лентим днем залетело в Тихую Гавань молодое резвое Торнадо. Навело шуму, напугало птичек, переворошило деревья и расположилось, наконец, в шезлонге из веток. Влево и вправо распустило свои руки, напоминавшие ленточки, эти руки трогали все вокруг, на что Торнадо совершенно не обращало внимания.<br />
<br />
- Кто ты? - спросил Дух Тихой Гавани.<br />
<br />
- Я? Торнадо, - ответило Торнадо, бегая глазами по Гавани.<br />
<br />
- Ну и что ты тут натворило? - проворчал Дух Тихой Гавани.<br />
<br />
- Я? Ничего. Я принесло сюда жизнь, ты не заметил? <br />
<br />
Казалось, Торнадо веселило все вокруг: и переполох, и озабоченный Дух, и даже сам ясный день. Дух Тихой Гавани задумался и сел на соседнее дерево.<br />
<br />
- Ну и откуда ты?<br />
<br />
- Я живу на Маленьком Острове. Вместе с Духом Маленького Острова и Юным Торнадо.<br />
<br />
Торнадо рассмеялось. Духу Тихой Гавани стало интересно: он никогда раньше не видел торнадо. <br />
<br />
День пролетел незаметно, за ним второй, третий. Торнадо летало по всей Гавани, рассматривая, будоража все, что попадалось на пути. Дух Тихой Гавани еле успевал бежать следом. А вечером третьего дня Торнадо собралось улетать.<br />
<br />
- Тебе так хочется домой? - поинтересовался Дух. Он мало что знал о торнадо.<br />
<br />
- Меня ждут на Маленьком Острове. И у меня много дел, - сказало Торнадо и собрало руки-ленточки в кучку. Почему-то стало грустно.<br />
<br />
Дух уже знал, что Торнадо не нравилось на Маленьком Острове, что оно переживало, потому что недавно поссорилось с жителями Большой Лощины и теперь не могло летать туда.<br />
<br />
- Ты еще вернешься? - спросил Дух Тихой Гавани с тайной надеждой.<br />
<br />
- Если ты хочешь, вернусь, - Торнадо опять улыбалось, завязывая руки-ленточки бантиками, как будто стеснялось. Торнадо понравился Дух Тихой Гавани, но оно боялось привязаться к нему, потому что еще совсем недавно оно рассталось с Духом Соснового Бора и теперь тяжело переживало разрыв. Буря мыслей пронеслась в голове Торнадо, одна задержалась - "а может..?"<br />
<br />
- Было бы здорово, - сказал Дух.<br />
<br />
И Торнадо улетело. А Духу Тихой Гавани стало пусто и одиноко без шумного Торнадо. Он осмотрел Тихую Гавань. "Кажется, тут как раз не хватает Торнадо. Слишком тихо тут у меня", подумал Дух.<br />
<br />
День сменялся ночью, лето - осенью. Между Тихой Гаванью и Маленьким Островом непрерывно курсировали голуби - они носили почту Торнадо и Духа Тихой Гавани. Письма были большие, тяжелые. Только некогда было Торнадо летать в Тихую Гавань. Много дел было у Торнадо на Маленьком Острове и в окрестностях. <br />
<br />
И тогда решился Дух Тихой Гавани навестить Маленький остров, он никогда там не был. Да он вообще мало где был. И зачем? Есть ведь Тихая Гавань, где всегда спокойно и уютно. Только пообщавшись с Торнадо он понял, какой же мир большой и шумный. И как это здорово, когда ты едешь в гости к Торнадо.<br />
<br />
После встречи на Маленьком Острове Торнадо решило изменить привычную жизнь. Осмотрело оно Большую Землю рядом с Тихой Гаванью и стало местечко для себя там подыскивать. <br />
Шло время.</div>Selhttps://wiki.shelek.ru/index.php?title=Tornado&diff=683Tornado2009-03-22T16:31:24Z<p>Sel: </p>
<hr />
<div>Каждый день Дух Тихой Гавани просыпался и принимался за работу. Осмотреть владения, собрать опавшие листики, поправить птичьи гнездышки, проследить, что творится в Пещерах, - много дел в Тихой Гавани. А вечером отдых - на мягких веточках, с кружкой чая в руке можно часами смотреть на океан. Можно поиграть со зверушками, а можно сходить в гости к другу, Духу Лесного Озера, с ним всегда есть о чем поговорить. Текла жизнь легко и непринужденно. Муза Пещеры готовила вкусные ужины, Дух Тихой Гавани любил сидеть в ее Пещере в свободное время. Беспокоила, правда, чета Пещерных Жителей с их Потомством, шумные они были, даже если не выходили из своей Пещеры, но Дух умел укрыться от них в своей любимой Пещерке.<br />
<br />
И вот однажды, теплым лентим днем залетело в Тихую Гавань молодое резвое Торнадо. Навело шуму, напугало птичек, переворошило деревья и расположилось, наконец, в шезлонге из веток. Влево и вправо распустило свои руки, напоминавшие ленточки, эти руки трогали все вокруг, на что Торнадо совершенно не обращало внимания.<br />
<br />
- Кто ты? - спросил Дух Тихой Гавани.<br />
<br />
- Я? Торнадо, - ответило Торнадо, бегая глазами по Гавани.<br />
<br />
- Ну и что ты тут натворило? - проворчал Дух Тихой Гавани.<br />
<br />
- Я? Ничего. Я принесло сюда жизнь, ты не заметил? <br />
<br />
Казалось, Торнадо веселило все вокруг: и переполох, и озабоченный Дух, и даже сам ясный день. Дух Тихой Гавани задумался и сел на соседнее дерево.<br />
<br />
- Ну и откуда ты?<br />
<br />
- Я живу на Маленьком Острове. Вместе с Духом Маленького Острова и Юным Торнадо.<br />
<br />
Торнадо рассмеялось. Духу Тихой Гавани стало интересно: он никогда раньше не видел торнадо. <br />
<br />
День пролетел незаметно, за ним второй, третий. Торнадо летало по всей Гавани, рассматривая, будоража все, что попадалось на пути. Дух Тихой Гавани еле успевал бежать следом. А вечером третьего дня Торнадо собралось улетать.<br />
<br />
- Тебе так хочется домой? - поинтересовался Дух. Он мало что знал о торнадо.<br />
<br />
- Меня ждут на Маленьком Острове. И у меня много дел, - сказало Торнадо и собрало руки-ленточки в кучку. Почему-то стало грустно.<br />
<br />
Дух уже знал, что Торнадо не нравилось на Маленьком Острове, что оно переживало, потому что недавно поссорилось с жителями Большой Лощины и теперь не могло летать туда.<br />
<br />
- Ты еще вернешься? - спросил Дух Тихой Гавани с тайной надеждой.<br />
<br />
- Если ты хочешь, вернусь, - Торнадо опять улыбалось, завязывая руки-ленточки бантиками, как будто стеснялось. Торнадо понравился Дух Тихой Гавани, но оно боялось привязаться к нему, потому что еще совсем недавно оно рассталось с Духом Соснового Бора и теперь тяжело переживало разрыв. Буря мыслей пронеслась в голове Торнадо, одна задержалась - "а может..?"<br />
<br />
- Было бы здорово, - сказал Дух.<br />
<br />
И Торнадо улетело. А Духу Тихой Гавани стало пусто и одиноко без шумного Торнадо. Он осмотрел Тихую Гавань. "Кажется, тут как раз не хватает Торнадо. Слишком тихо тут у меня", подумал Дух.<br />
<br />
День сменялся ночью, лето - осенью. Между Тихой Гаванью и Маленьким Островом непрерывно курсировали голуби - они носили почту Торнадо и Духа Тихой Гавани. Письма были большие, тяжелые. Залетало Торнадо в Тихую Гавань и еще. Но редко. <br />
Много дел было у Торнадо на Маленьком Острове и в окрестностях. <br />
<br />
И решился Дух Тихой Гавани навестить Маленький остров, он никогда там не был. Да он вообще мало где был. И зачем? Есть ведь Тихая Гавань, где всегда спокойно и уютно. Только пообщавшись с Торнадо он понял, какой же мир большой и шумный. И как это здорово, когда ты едешь в гости к Торнадо.<br />
<br />
Шло время.</div>Selhttps://wiki.shelek.ru/index.php?title=Tornado&diff=682Tornado2009-03-22T16:13:10Z<p>Sel: </p>
<hr />
<div>Каждый день Дух Тихой Гавани просыпался и принимался за работу. Осмотреть владения, собрать опавшие листики, поправить птичьи гнездышки, проследить, что творится в Пещерах, - много дел в Тихой Гавани. А вечером отдых - на мягких веточках, с кружкой чая в руке можно часами смотреть на океан. Можно поиграть со зверушками, а можно сходить в гости к другу, Духу Лесного Озера, с ним всегда есть о чем поговорить. Текла жизнь легко и непринужденно. Муза Пещеры готовила вкусные ужины, Дух Тихой Гавани любил сидеть в ее Пещере в свободное время. Беспокоила, правда, чета Пещерных Жителей с их Потомством, шумные они были, даже если не выходили из своей Пещеры, но Дух умел укрыться от них в своей любимой Пещерке.<br />
<br />
И вот однажды, теплым лентим днем залетело в Тихую Гавань молодое резвое Торнадо. Навело шуму, напугало птичек, переворошило деревья и расположилось, наконец, в шезлонге из веток. Влево и вправо распустило свои руки, напоминавшие ленточки, эти руки трогали все вокруг, на что Торнадо совершенно не обращало внимания.<br />
<br />
- Кто ты? - спросил Дух Тихой Гавани.<br />
<br />
- Я? Торнадо, - ответило Торнадо, бегая глазами по Гавани.<br />
<br />
- Ну и что ты тут натворило? - проворчал Дух Тихой Гавани.<br />
<br />
- Я? Ничего. Я принесло сюда жизнь, ты не заметил? <br />
<br />
Казалось, Торнадо веселило все вокруг: и переполох, и озабоченный Дух, и даже сам ясный день. Дух Тихой Гавани задумался и сел на соседнее дерево.<br />
<br />
- Ну и откуда ты?<br />
<br />
- Я живу на Маленьком Острове. Вместе с Духом Маленького Острова и Юным Торнадо.<br />
<br />
Торнадо рассмеялось. Духу Тихой Гавани стало интересно: он никогда раньше не видел торнадо. <br />
<br />
День пролетел незаметно, за ним второй, третий. Торнадо летало по всей Гавани, рассматривая, будоража все, что попадалось на пути. Дух Тихой Гавани еле успевал бежать следом. А вечером третьего дня Торнадо собралось улетать.<br />
<br />
- Тебе так хочется домой? - поинтересовался Дух. Он мало что знал о торнадо.<br />
<br />
- Меня ждут на Маленьком Острове. И у меня много дел, - сказало Торнадо и собрало руки-ленточки в кучку. Почему-то стало грустно.<br />
<br />
- Ты еще вернешься? - спросил Дух Тихой Гавани с тайной надеждой.<br />
<br />
- Если ты хочешь, вернусь, - Торнадо опять улыбалось, завязывая руки-ленточки бантиками, как будто стеснялось.<br />
<br />
- Было бы здорово, - сказал Дух.<br />
<br />
И Торнадо улетело. А Духу Тихой Гавани стало пусто и одиноко без шумного Торнадо. Он осмотрел Тихую Гавань. "Кажется, тут как раз не хватает Торнадо. Слишком тихо тут у меня", подумал Дух.<br />
<br />
День сменялся ночью, лето - осенью. Между Тихой Гаванью и Маленьким Островом непрерывно курсировали голуби - они носили почту Торнадо и Духа Тихой Гавани. Письма были большие, тяжелые. Залетало Торнадо в Тихую Гавань и еще. Но редко. <br />
Много дел было у Торнадо на Маленьком Острове и в окрестностях. <br />
<br />
И решился Дух Тихой Гавани навестить Маленький остров, он никогда там не был. Да он вообще мало где был. И зачем? Есть ведь Тихая Гавань, где всегда спокойно и уютно. Только пообщавшись с Торнадо он понял, какой же мир большой и шумный. И как это здорово, когда ты едешь в гости к Торнадо.<br />
<br />
Шло время.</div>Selhttps://wiki.shelek.ru/index.php?title=Tornado&diff=681Tornado2009-03-22T15:35:21Z<p>Sel: </p>
<hr />
<div>Каждый день Дух Тихой Гавани просыпался и принимался за работу. Осмотреть владения, собрать опавшие листики, поправить птичьи гнездышки, - много дел в Тихой Гавани. А вечером отдых - на мягких веточках, с кружкой чая в руке можно часами смотреть на океан. Можно поиграть со зверушками, а можно сходить в гости к другу, Духу Лесного Озера, с ним всегда есть о чем поговорить. Текла жизнь легко и непринужденно.<br />
<br />
И вот однажды, теплым лентим днем залетело в Тихую Гавань молодое резвое Торнадо. Навело шуму, напугало птичек, переворошило деревья и расположилось, наконец, в шезлонге из веток. Влево и вправо распустило свои руки, напоминавшие ленточки, эти руки трогали все вокруг, на что Торнадо совершенно не обращало внимания.<br />
<br />
- Кто ты? - спросил Дух Тихой Гавани.<br />
<br />
- Я? Торнадо, - ответило Торнадо, бегая глазами по Гавани.<br />
<br />
- Ну и что ты тут натворило? - проворчал Дух Тихой Гавани.<br />
<br />
- Я? Ничего. Я принесло сюда жизнь, ты не заметил? <br />
<br />
Казалось, Торнадо веселило все вокруг: и переполох, и озабоченный Дух, и даже сам ясный день. Дух Тихой Гавани задумался и сел на соседнее дерево.<br />
<br />
- Ну и откуда ты?<br />
<br />
- Я живу на Маленьком Острове. Вместе с Духом Маленького Острова и Юным Торнадо.<br />
<br />
Торнадо рассмеялось. Духу Тихой Гавани стало интересно: он никогда раньше не видел торнадо. <br />
<br />
День пролетел незаметно, за ним второй, третий. Торнадо летало по всей Гавани, рассматривая, будоража все, что попадалось на пути. Дух Тихой Гавани еле успевал бежать следом. А вечером третьего дня Торнадо собралось улетать.<br />
<br />
- Тебе так хочется домой? - поинтересовался Дух. Он мало что знал о торнадо.<br />
<br />
- Меня ждут на Маленьком Острове. И у меня много дел, - сказало Торнадо и собрало руки-ленточки в кучку. Почему-то стало грустно.<br />
<br />
- Ты еще вернешься? - спросил Дух Тихой Гавани с тайной надеждой.<br />
<br />
- Если ты хочешь, вернусь, - Торнадо опять улыбалось, завязывая руки-ленточки бантиками, как будто стеснялось.<br />
<br />
- Было бы здорово, - сказал Дух.<br />
<br />
И Торнадо улетело. А Духу Тихой Гавани стало пусто и одиноко без шумного Торнадо. Он осмотрел Тихую Гавань. "Кажется, тут как раз не хватает Торнадо. Слишком тихо тут у меня", подумал Дух.<br />
<br />
День сменялся ночью, лето - осенью. Между Тихой Гаванью и Маленьким Островом непрерывно курсировали голуби - они носили почту Торнадо и Духа Тихой Гавани. Письма были большие, тяжелые. Залетало Торнадо в Тихую Гавань и еще. Но редко. <br />
Много дел было у Торнадо на Маленьком Острове и в окрестностях. <br />
<br />
И решился Дух Тихой Гавани навестить Маленький остров, он никогда там не был. Да он вообще мало где был. И зачем? Есть ведь Тихая Гавань, где всегда спокойно и уютно. Только пообщавшись с Торнадо он понял, какой же мир большой и шумный. И как это здорово, когда ты едешь в гости к Торнадо.<br />
<br />
Шло время.</div>Selhttps://wiki.shelek.ru/index.php?title=Tornado&diff=680Tornado2009-03-22T15:27:35Z<p>Sel: Новая: Каждый день Дух Тихой Гавани просыпался и принимался за работу. Осмотреть владения, собрать опавшие л...</p>
<hr />
<div>Каждый день Дух Тихой Гавани просыпался и принимался за работу. Осмотреть владения, собрать опавшие листики, поправить птичьи гнездышки, - много дел в Тихой Гавани. А вечером отдых - на мягких веточках, с кружкой чая в руке можно часами смотреть на океан. Можно поиграть со зверушками, а можно сходить в гости к другу, Духу Лесного Озера, с ним всегда есть о чем поговорить. Текла жизнь легко и непринужденно.<br />
И вот однажды, теплым лентим днем залетело в Тихую Гавань молодое резвое Торнадо. Навело шуму, напугало птичек, переворошило деревья и расположилось, наконец, в шезлонге из веток. Влево и вправо распустило свои руки, напоминавшие ленточки, эти руки трогали все вокруг, на что Торнадо совершенно не обращало внимания.<br />
- Кто ты? - спросил Дух Тихой Гавани.<br />
- Я? Торнадо, - ответило Торнадо, бегая глазами по Гавани.<br />
- Ну и что ты тут натворило? - проворчал Дух Тихой Гавани.<br />
- Я? Ничего. Я принесло сюда жизнь, ты не заметил? <br />
Казалось, Торнадо веселило все вокруг: и переполох, и озабоченный Дух, и даже сам ясный день. Дух Тихой Гавани задумался и сел на соседнее дерево.<br />
- Ну и откуда ты?<br />
- Эээ... Сложно сказать. Наверное, ниоткуда. Потому что я везде. И нигде.<br />
Торнадо рассмеялось. Духу Тихой Гавани стало интересно: он никогда раньше не видел торнадо. День пролетел незаметно, за ним второй, третий. Торнадо летало по всей Гавани, рассматривая, будоража все, что попадалось на пути. Дух Тихой Гавани еле успевал бежать следом. А вечером третьего дня Торнадо собралось улетать.<br />
- У тебя есть дом? - поинтересовался Дух. Он мало что знал о торнадо.<br />
- Есть дом на Маленьком Острове. Там меня ждут Дух Маленького Острова и маленькое Торнадо, - сказало Торнадо и собрало руки-ленточки в кучку. Почему-то стало грустно.<br />
- Ты еще вернешься? - спросил Дух Тихой Гавани с тайной надеждой.<br />
- Если ты хочешь, вернусь, - Торнадо опять улыбалось, завязывая руки-ленточки бантиками, как будто стеснялось.<br />
- Было бы здорово, - сказал Дух.<br />
И Торнадо улетело. А Духу Тихой Гавани стало пусто и одиноко без шумного Торнадо. Он осмотрел Тихую Гавань. "Кажется, тут как раз не хватает Торнадо. Слишком тихо тут у меня", подумал Дух.<br />
День сменялся ночью, лето - осенью. Между Тихой Гаванью и Маленьким Островом непрерывно курсировали голуби - они носили почту Торнадо и Духа Тихой Гавани. Письма были большие, тяжелые. Залетало Торнадо в Тихую Гавань и еще. Но редко. Много дел было у Торнадо на Маленьком Острове и в окрестностях. И решился Дух Тихой Гавани навестить Маленький остров, он никогда там не был. Да он вообще мало где был. И зачем? Есть ведь Тихая Гавань, где всегда спокойно и уютно. Только пообщавшись с Торнадо он понял, какой же мир большой и шумный. И как это здорово, когда ты едешь в гости к Торнадо.<br />
Шло время.</div>Selhttps://wiki.shelek.ru/index.php?title=Degrees_of_Comparison&diff=485Degrees of Comparison2008-10-01T18:03:00Z<p>Sel: </p>
<hr />
<div>Односложные имена прилагательные образуют сравнительную степень путем прибавления суффикса '''–er'''<br />
cheap – cheaper<br />
thin – thinner<br />
large – larger<br />
<br />
Суффикс '''–er''' используется для образования '''сравнительной степени''' двусложных слов с окончаниями:<br />
'''-y, -er, -ow, -le''' <br />
pretty – prettier<br />
silly - sillier <br />
easy – easier <br />
'''Исключения''': <br />
bad – worse – the worst<br />
far – further / farther – the furthest / farthest<br />
good – better – the best<br />
old – older / elder – the oldest / eldest<br />
many / much – more – the most<br />
little – less – the least<br />
<br />
Двусложные (и многосложные) имена прилагательные образуют сравнительную степень путем прибавления слова <br />
'''more'''<br />
modern – more modern<br />
serious – more serious<br />
often – more often<br />
<br />
Так же образуют сравнительную степень и наречия на '''-ly'''<br />
slowly – more slowly<br />
quietly – more quietly<br />
<br />
Оба варианта могут быть использованы с некоторыми именами прилагательными<br />
quiet; clever; narrow; shallow; simple<br />
<br />
Сравнительная степень может употребляться со словом '''much'''<br />
much more interesting<br />
<br />
'''Превосходная''' степень сравнения от односложных прилагательных образуется путем прибавления суффикса '''-est''' (и обязательно добавляется '''the'''). <br />
the fastest; the biggest; the nicest<br />
<br />
К двусложным прилагательным на '''-y, -er, -ow, -le''' также присоединяется суффикс '''-est'''. <br />
the prettiest; the funniest; the happiest <br />
<br />
Превосходная степень двусложных (и многосложных) прилагательных образуется путем прибавления слова '''the most'''<br />
the most dangerous; the most expensive; the most fantastic<br />
<br />
Самая трудная задача = the most difficult task<br />
<br />
Чрезвычайно трудная задача = a most difficult task<br />
<br />
Употребление прилагательного в ед. ч. = a bigger table<br />
<br />
во мн. ч. = __ bigger tables<br />
<br />
[[Category:Английский_язык]]</div>Selhttps://wiki.shelek.ru/index.php?title=Degrees_of_Comparison&diff=484Degrees of Comparison2008-10-01T18:01:07Z<p>Sel: </p>
<hr />
<div>Односложные имена прилагательные образуют сравнительную степень путем прибавления суффикса '''–er'''<br />
cheap – cheaper<br />
thin – thinner<br />
large – larger<br />
<br />
Суффикс '''–er''' используется для образования сравнительной степени двусложных слов с окончаниями:<br />
'''-y, -er, -ow, -le''' <br />
pretty – prettier<br />
silly - sillier <br />
easy – easier <br />
'''Исключения''': <br />
bad – worse – the worst<br />
far – further / farther – the furthest / farthest<br />
good – better – the best<br />
old – older / elder – the oldest / eldest<br />
many / much – more – the most<br />
little – less – the least<br />
<br />
Двусложные (и многосложные) имена прилагательные образуют сравнительную степень путем прибавления слова <br />
'''more'''<br />
modern – more modern<br />
serious – more serious<br />
often – more often<br />
<br />
Так же образуют сравнительную степень и наречия на '''-ly'''<br />
slowly – more slowly<br />
quietly – more quietly<br />
<br />
Оба варианта могут быть использованы с некоторыми именами прилагательными<br />
quiet; clever; narrow; shallow; simple<br />
<br />
Сравнительная степень может употребляться со словом '''much'''<br />
much more interesting<br />
<br />
'''Превосходная''' степень сравнения от односложных прилагательных образуется путем прибавления суффикса '''-est''' (и обязательно добавляется '''the'''). <br />
the fastest; the biggest; the nicest<br />
<br />
К двусложным прилагательным на '''-y, -er, -ow, -le''' также присоединяется суффикс '''-est'''. <br />
the prettiest; the funniest; the happiest <br />
<br />
Превосходная степень двусложных (и многосложных) прилагательных образуется путем прибавления слова '''the most'''<br />
the most dangerous; the most expensive; the most fantastic<br />
<br />
Самая трудная задача = the most difficult task<br />
<br />
Чрезвычайно трудная задача = a most difficult task<br />
<br />
Употребление прилагательного в ед. ч. = a bigger table<br />
<br />
во мн. ч. = __ bigger tables<br />
<br />
[[Category:Английский_язык]]</div>Selhttps://wiki.shelek.ru/index.php?title=Degrees_of_Comparison&diff=483Degrees of Comparison2008-10-01T17:19:34Z<p>Sel: </p>
<hr />
<div>Односложные имена прилагательные образуют сравнительную степень путем прибавления суффикса '''–er'''<br />
cheap – cheaper<br />
thin – thinner<br />
large – larger<br />
easy – easier <br />
<br />
Суффикс '''–er''' используется для образования сравнительной степени двусложных слов с окончаниями:<br />
'''-y, -er, -ow, -le''' <br />
pretty – prettier<br />
silly - sillier <br />
<br />
'''Исключения''': <br />
bad – worse – the worst<br />
far – further / farther – the furthest / farthest<br />
good – better – the best<br />
old – older / elder – the oldest / eldest<br />
many / much – more – the most<br />
little – less – the least<br />
<br />
Двусложные (и многосложные) имена прилагательные образуют сравнительную степень путем прибавления слова <br />
'''more'''<br />
modern – more modern<br />
serious – more serious<br />
often – more often<br />
<br />
Так же образуют сравнительную степень и наречия на '''-ly'''<br />
slowly – more slowly<br />
quietly – more quietly<br />
<br />
Оба варианта могут быть использованы с некоторыми именами прилагательными<br />
quiet; clever; narrow; shallow; simple<br />
<br />
Сравнительная степень может употребляться со словом '''much'''<br />
much more interesting<br />
<br />
'''Превосходная''' степень сравнения от односложных прилагательных образуется путем прибавления суффикса '''-est''' (и обязательно добавляется '''the'''). <br />
the fastest; the biggest; the nicest<br />
<br />
К двусложным прилагательным на '''-y, -er, -ow, -le''' также присоединяется суффикс '''-est'''. <br />
the prettiest; the funniest; the happiest <br />
<br />
Превосходная степень двусложных (и многосложных) прилагательных образуется путем прибавления слова '''the most'''<br />
the most dangerous; the most expensive; the most fantastic<br />
<br />
Самая трудная задача = the most difficult task<br />
<br />
Чрезвычайно трудная задача = a most difficult task<br />
<br />
Употребление прилагательного в ед. ч. = a bigger table<br />
<br />
во мн. ч. = __ bigger tables<br />
<br />
[[Category:Английский_язык]]</div>Selhttps://wiki.shelek.ru/index.php?title=Degrees_of_Comparison&diff=479Degrees of Comparison2008-09-30T20:38:55Z<p>Sel: </p>
<hr />
<div>Односложные имена прилагательные образуют сравнительную степень путем прибавления суффикса '''–er'''<br />
cheap – cheaper<br />
thin – thinner<br />
large – larger<br />
easy – easier <br />
<br />
Суффикс '''–er''' используется для образования сравнительной степени двусложных слов с окончаниями:<br />
'''-y, -er, -ow, -le''' <br />
pretty – prettier<br />
silly - sillier <br />
<br />
'''Исключения''': <br />
bad – worse – the worst<br />
far – further / farther – the furthest / farthest<br />
good – better – the best<br />
old – older / elder – the oldest / eldest<br />
early – earlier – the earliest <br />
many / much – more – the most<br />
little – less – the least<br />
<br />
Двусложные (и многосложные) имена прилагательные образуют сравнительную степень путем прибавления слова <br />
'''more'''<br />
modern – more modern<br />
serious – more serious<br />
often – more often<br />
<br />
Так же образуют сравнительную степень и наречия на '''-ly'''<br />
slowly – more slowly<br />
quietly – more quietly<br />
<br />
Оба варианта могут быть использованы с некоторыми именами прилагательными<br />
quiet; clever; narrow; shallow; simple<br />
<br />
Сравнительная степень может употребляться со словом '''much'''<br />
much more interesting<br />
<br />
'''Превосходная''' степень сравнения от односложных прилагательных образуется путем прибавления суффикса '''-est''' (и обязательно добавляется '''the'''). <br />
the fastest; the biggest; the nicest<br />
<br />
К двусложным прилагательным на '''-y, -er, -ow, -le''' также присоединяется суффикс '''-est'''. <br />
the prettiest; the funniest; the happiest <br />
<br />
Превосходная степень двусложных (и многосложных) прилагательных образуется путем прибавления слова '''the most'''<br />
the most dangerous; the most expensive; the most fantastic<br />
<br />
Самая трудная задача = the most difficult task<br />
<br />
Чрезвычайно трудная задача = a most difficult task<br />
<br />
Употребление прилагательного в ед. ч. = a bigger table<br />
<br />
во мн. ч. = __ bigger tables</div>Selhttps://wiki.shelek.ru/index.php?title=Degrees_of_Comparison&diff=478Degrees of Comparison2008-09-30T20:37:57Z<p>Sel: Новая: Односложные имена прилагательные образуют сравнительную степень путем прибавления суффикса '''–er''' ...</p>
<hr />
<div>Односложные имена прилагательные образуют сравнительную степень путем прибавления суффикса '''–er'''<br />
cheap – cheaper<br />
thin – thinner<br />
large – larger<br />
easy – easier <br />
<br />
Суффикс '''–er''' используется для образования сравнительной степени двусложных слов с окончаниями:<br />
'''-y, -er, -ow, -le''' <br />
pretty – prettier<br />
silly - sillier <br />
<br />
'''Исключения''': <br />
bad – worse – the worst<br />
far – further / farther – the furthest / farthest<br />
good – better – the best<br />
old – older / elder – the oldest / eldest<br />
early – earlier – the earliest <br />
many / much – more – the most<br />
little – less – the least<br />
<br />
Двусложные (и многосложные) имена прилагательные образуют сравнительную степень путем прибавления слова <br />
'''more'''<br />
modern – more modern<br />
serious – more serious<br />
often – more often<br />
<br />
Так же образуют сравнительную степень и наречия на '''-ly'''<br />
slowly – more slowly<br />
quietly – more quietly<br />
<br />
Оба варианта могут быть использованы с некоторыми именами прилагательными<br />
quiet; clever; narrow; shallow; simple<br />
<br />
Сравнительная степень может употребляться со словом '''much'''<br />
much more interesting<br />
<br />
'''Превосходная''' степень сравнения от односложных прилагательных образуется путем прибавления суффикса '''-est''' (и обязательно добавляется '''the'''). <br />
the fastest; the biggest; the nicest<br />
<br />
К двусложным прилагательным на '''-y, -er, -ow, -le''' также присоединяется суффикс '''-est'''. <br />
the prettiest; the funniest; the happiest <br />
<br />
Превосходная степень двусложных (и многосложных) прилагательных образуется путем прибавления слова '''the most'''<br />
the most dangerous; the most expensive; the most fantastic<br />
<br />
Самая трудная задача = the most difficult task<br />
Чрезвычайно трудная задача = a most difficult task<br />
<br />
Употребление прилагательного в ед. ч. = a bigger table<br />
во мн. ч. = __ bigger tables</div>Selhttps://wiki.shelek.ru/index.php?title=Plural_Noun&diff=467Plural Noun2008-09-30T09:22:58Z<p>Sel: </p>
<hr />
<div>Множественное число имен существительных образуется путем прибавления окончания '''-s''', которое произносится по-разному.<br />
<br />
'''[s]''' после глухих согласных<br />
'''[z]''' после звонких согласных и гласных <br />
a part – parts <br />
a pen – pens <br />
a play - plays<br />
<br />
Имя существительное в единственном числе оканчивается на '''-s, -ss, -x, -sh, -ch, -tch'''.<br />
'''-es [iz]''' <br />
a bus – buses; a match – matches<br />
<br />
Имя существительное в единственном числе оканчивается на '''-y''':<br />
'''y → i + -es [iz]''' <br />
an army – armies<br />
<br />
Если перед '''у''' стоит '''гласная''' - замены не происходит: добавляется '''-s''' <br />
a day – days <br />
<br />
Имя существительное в единственном числе оканчивается на '''-о''': '''-es [z]''' <br />
a hero – heroes<br />
'''but''': <br />
pianos; photos; radios<br />
<br />
Имя существительное в единственном числе оканчивается на '''-fe, -f'''. <br />
'''fe → v + -es [z]''' a knife – knives <br />
'''but''': <br />
a roof; a handkerchief; a chief<br />
<br />
Множественное число некоторых существительных образуется путем изменения '''корневой гласной''':<br />
a man – men<br />
a woman – women <br />
a foot – feet<br />
a tooth – teeth<br />
a mouse – mice<br />
a child – children<br />
a goose – geese<br />
a deer – deer<br />
an ox – oxen<br />
a sheep – sheep<br />
<br />
====Сложные имена существительные====<br />
Окончание множественного числа принимает '''второе имя существительное''': <br />
a schoolboy; a hotel-keeper<br />
<br />
Первым элементом сложного имени существительного является слово '''man / woman''': оба слова принимают окончание множественного числа <br />
a man-servant – men-servants<br />
<br />
Сложное имя существительное включает '''предлог''': первая часть принимает форму множественного числа: <br />
a mother-in-law – mothers-in-law; <br />
a man-of-war - men-of-war<br />
<br />
Имя существительное оканчивается на '''is [is]''' - окончание меняется на '''-es [iz]'''<br />
a diagnosis – diagnoses; axis – axes.</div>Selhttps://wiki.shelek.ru/index.php?title=Plural_Noun&diff=466Plural Noun2008-09-30T09:13:46Z<p>Sel: </p>
<hr />
<div>Множественное число имен существительных образуется путем прибавления окончания -s, которое произносится по-разному.<br />
[s] после глухих согласных<br />
[z] после звонких согласных и гласных <br />
a part – parts <br />
a pen – pens <br />
a play - plays<br />
<br />
Имя существительное в единственном числе оканчивается на –s, -ss, -x, -sh, -ch, -tch.<br />
-es [iz] <br />
a bus – buses; a match – matches<br />
<br />
Имя существительное в единственном числе оканчивается на -y:<br />
y → i + -es [iz] <br />
an army – armies<br />
<br />
Если перед у стоит гласная - замены не происходит: + -s <br />
a day – days <br />
<br />
Имя существительное в единственном числе оканчивается на -о: -es [z] <br />
a hero – heroes<br />
but: <br />
pianos; photos; radios<br />
<br />
Имя существительное в единственном числе оканчивается на –fe, -f. <br />
fe → v + -es [z] a knife – knives <br />
but: <br />
a roof; a handkerchief; a chief<br />
<br />
Множественное число некоторых существительных образуется путем изменения корневой гласной:<br />
a man – men<br />
a woman – women <br />
a foot – feet<br />
a tooth – teeth<br />
a mouse – mice<br />
a child – children<br />
a goose – geese<br />
a deer – deer<br />
an ox – oxen<br />
a sheep – sheep<br />
<br />
====Сложные имена существительные====<br />
Окончание множественного числа принимает второе имя существительное: <br />
a schoolboy; a hotel-keeper<br />
<br />
Первым элементом сложного имени существительного является слово man / woman: оба слова принимают окончание множественного числа <br />
a man-servant – men-servants<br />
<br />
Сложное имя существительное включает предлог: первая часть принимает форму множественного числа: <br />
a mother-in-law – mothers-in-law; <br />
a man-of-war - men-of-war<br />
<br />
Имя существительное оканчивается на is [is] - окончание меняется на -es [iz]<br />
a diagnosis – diagnoses; axis – axes.</div>Selhttps://wiki.shelek.ru/index.php?title=Plural_Noun&diff=465Plural Noun2008-09-30T09:12:03Z<p>Sel: </p>
<hr />
<div>===Plural Noun===<br />
<br />
Множественное число имен существительных образуется путем прибавления окончания -s, которое произносится по-разному. <br />
[s] после глухих согласных<br />
[z] после звонких согласных и гласных <br />
a part – parts <br />
a pen – pens <br />
a play - plays<br />
<br />
Имя существительное в единственном числе оканчивается на –s, -ss, -x, -sh, -ch, -tch.<br />
-es [iz] <br />
a bus – buses; a match – matches<br />
<br />
Имя существительное в единственном числе оканчивается на -y:<br />
y → i + -es [iz] <br />
an army – armies<br />
<br />
Если перед у стоит гласная - замены не происходит: + -s <br />
a day – days <br />
<br />
Имя существительное в единственном числе оканчивается на -о: -es [z] <br />
a hero – heroes<br />
but: <br />
pianos; photos; radios<br />
<br />
Имя существительное в единственном числе оканчивается на –fe, -f. <br />
fe → v + -es [z] a knife – knives <br />
but: <br />
a roof; a handkerchief; a chief<br />
<br />
Множественное число некоторых существительных образуется путем изменения корневой гласной:<br />
a man – men<br />
a woman – women <br />
a foot – feet<br />
a tooth – teeth<br />
a mouse – mice<br />
a child – children<br />
a goose – geese<br />
a deer – deer<br />
an ox – oxen<br />
a sheep – sheep<br />
<br />
Сложные имена существительные<br />
Окончание множественного числа принимает второе иям существительное: <br />
a schoolboy; a hotel-keeper<br />
<br />
Первым элементом сложного имени существительного является слово man / woman: оба слова принимают окончание множественного числа <br />
a man-servant – men-servants<br />
<br />
Сложное имя существительное включает предлог: первая часть принимает форму множественного числа: <br />
a mother-in-law – mothers-in-law; <br />
a man-of-war - men-of-war<br />
<br />
Имя существительное оканчивается на is [is] - окончание меняется на -es [iz]<br />
a diagnosis – diagnoses; axis – axes.</div>Selhttps://wiki.shelek.ru/index.php?title=Plural_Noun&diff=464Plural Noun2008-09-30T09:04:52Z<p>Sel: </p>
<hr />
<div>Plural Noun<br />
Множественное число имен существительных образуется путем прибавления окончания -s, которое произносится по-разному. <br />
[s] после глухих согласных<br />
[z] после звонких согласных и гласных <br />
a part – parts <br />
a pen – pens <br />
a play - plays<br />
<br />
Имя существительное в единственном числе оканчивается на –s, -ss, -x, -sh, -ch, -tch.<br />
-es [iz] <br />
a bus – buses; a match – matches<br />
<br />
Имя существительное в единственном числе оканчивается на -y:<br />
y → i + -es [iz] <br />
an army – armies<br />
<br />
Если перед у стоит гласная - замены не происходит: + -s <br />
a day – days <br />
<br />
Имя существительное в единственном числе оканчивается на -о: -es [z] <br />
a hero – heroes<br />
but: <br />
pianos; photos; radios<br />
<br />
Имя существительное в единственном числе оканчивается на –fe, -f. <br />
fe → v + -es [z] a knife – knives <br />
but: <br />
a roof; a handkerchief; a chief<br />
<br />
Множественное число некоторых существительных образуется путем изменения корневой гласной:<br />
a man – men<br />
a woman – women <br />
a foot – feet<br />
a tooth – teeth<br />
a mouse – mice<br />
a child – children<br />
a goose – geese<br />
a deer – deer<br />
an ox – oxen<br />
a sheep – sheep<br />
<br />
Сложные имена существительные<br />
Окончание множественного числа принимает второе иям существительное: <br />
a schoolboy; a hotel-keeper<br />
<br />
Первым элементом сложного имени существительного является слово man / woman: оба слова принимают окончание множественного числа <br />
a man-servant – men-servants<br />
<br />
Сложное имя существительное включает предлог: первая часть принимает форму множественного числа: <br />
a mother-in-law – mothers-in-law; <br />
a man-of-war - men-of-war<br />
<br />
Имя существительное оканчивается на is [is] - окончание меняется на -es [iz]<br />
a diagnosis – diagnoses; axis – axes.</div>Selhttps://wiki.shelek.ru/index.php?title=Plural_Noun&diff=463Plural Noun2008-09-30T09:01:09Z<p>Sel: </p>
<hr />
<div>Plural Noun<br />
Множественное число имен существительных образуется путем прибавления окончания -s, которое произносится по-разному. <br />
[s] после глухих согласных<br />
[z] после звонких согласных и гласных <br />
a part – parts <br />
a pen – pens <br />
a play - plays<br />
<br />
Имя существительное в единственном числе оканчивается на –s, -ss, -x, -sh, -ch, -tch.<br />
-es [iz] a bus – buses; a match – matches<br />
<br />
Имя существительное в единственном числе оканчивается на -y y → i + -es<br />
[iz] <br />
an army – armies<br />
<br />
Если перед у стоит гласная - замены не происходит: + -s a day – days <br />
<br />
Имя существительное в единственном числе оканчивается на -о: -es [z] <br />
a hero – heroes<br />
but: pianos; photos; radios<br />
<br />
Имя существительное в единственном числе оканчивается на –fe, -f. <br />
fe → v + -es [z] a knife – knives <br />
but: a roof; a handkerchief; a chief<br />
<br />
Множественное число некоторых существительных образуется путем изменения корневой гласной: a man – men<br />
a woman – women <br />
a foot – feet<br />
a tooth – teeth<br />
a mouse – mice<br />
a child – children<br />
a goose – geese<br />
a deer – deer<br />
an ox – oxen<br />
a sheep – sheep<br />
<br />
Сложные имена существительные<br />
Окончание множественного числа принимает второе иям существительное: <br />
a schoolboy; a hotel-keeper<br />
<br />
Первым элементом сложного имени существительного является слово man / woman: оба слова принимают окончание множественного числа <br />
a man-servant – men-servants<br />
<br />
Сложное имя существительное включает предлог: первая часть принимает форму множественного числа: a mother-in-law – mothers-in-law; <br />
a man-of-war - men-of-war<br />
<br />
Имя существительное оканчивается на is [is] - окончание меняется на -es [iz]<br />
a diagnosis – diagnoses; axis – axes.</div>Selhttps://wiki.shelek.ru/index.php?title=Plural_Noun&diff=462Plural Noun2008-09-30T08:56:19Z<p>Sel: Новая: Plural Noun Множественное число имен существительных образуется путем прибавления окончания [b]-s[/b], котор...</p>
<hr />
<div>Plural Noun<br />
Множественное число имен существительных образуется путем прибавления окончания [b]-s[/b], которое произносится по-разному. <br />
[b][s][/b] после глухих согласных<br />
[b][z][/b] после звонких согласных и гласных <br />
[i]a part – parts <br />
a pen – pens <br />
a play - plays[/i]<br />
<br />
Имя существительное в единственном числе оканчивается на <br />
[b]–s, -ss, -x, -sh, -ch, -tch.[/b] <br />
-es [iz] a bus – buses; a match – matches<br />
<br />
Имя существительное в единственном числе оканчивается на <br />
[b]-y[/b] y → i + -es<br />
[iz] <br />
[i]an army – armies[/i]<br />
<br />
Если перед [b][i]у[/b][/i] стоит гласная - замены не происходит<br />
[b]+ -s[/b] a day – days <br />
<br />
Имя существительное в единственном числе оканчивается на [b]-о[/b]<br />
[b]-es [z][/b] a hero – heroes<br />
[b]but[/b]: [i]pianos; photos; radios[/i]<br />
<br />
Имя существительное в единственном числе оканчивается на [b]–fe, -f[/b]. <br />
fe → v + -es [z] a knife – knives <br />
[b]but[/b]: [i]a roof; a handkerchief; a chief[/i]<br />
<br />
Множественное число некоторых существительных образуется путем изменения корневой гласной: [i]a man – men<br />
a woman – women <br />
a foot – feet<br />
a tooth – teeth<br />
a mouse – mice<br />
a child – children<br />
a goose – geese<br />
a deer – deer<br />
an ox – oxen<br />
a sheep – sheep[/i]<br />
<br />
[b]Сложные имена существительные[/b]<br />
Окончание множественного числа принимает второе иям существительное: [i]a schoolboy; a hotel-keeper[/i]<br />
<br />
Первым элементом сложного имени существительного является слово [b]man / woman[/b]: оба слова принимают окончание множественного числа <br />
[i]a man-servant – men-servants[/i]<br />
<br />
Сложное имя существительное включает предлог: первая часть принимает формумножественного числа: [i]a mother-in-law – mothers-in-law; <br />
a man-of-war - men-of-war[/i]<br />
<br />
Имя существительное оканчивается на [b]is[/b] [is] - окончание меняется на [b]-es[/b] [iz] [i]diagnosis – diagnoses; axis – axes;[/i]</div>Selhttps://wiki.shelek.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&diff=461Заглавная страница2008-09-30T08:30:26Z<p>Sel: </p>
<hr />
<div>__NOTOC__<br />
=Википедия Клуба программистов "Весельчака У"=<br />
<br />
==Разделы==<br />
<br />
===[[FAQ:Содержание|Ответы на часто задаваемые вопросы]].===<br />
Составлено по темам [[Форум программистов|нашего форума]].<br />
<br />
===[[Английский язык|Правила английского языка]].===</div>Selhttps://wiki.shelek.ru/index.php?title=FAQ:STL:C%2B%2B_%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&diff=460FAQ:STL:C++ сериализация данных2008-09-30T08:27:20Z<p>Sel: </p>
<hr />
<div>Иногда нужно сохранить состояние класса в файл, передать состояние класса по сети. Подобные задачи обычно решает сериализация. <br />
<br />
Говоря о сериализации, я подразумеваю механизмы перевода некоторого класса, структуры или набора переменных в определённый формат (бинарный, текстовый, XML, HTML и т.д.), а также сам процесс перевода. Десериализация - процессы и механизмы, обратные сериализации (восстановление состояния из внешнего источника). <br />
<br />
Самый простой способ, к которому чаще всего прибегают молодые программисты, - это простое копирование памяти в файл или еще куда-то. Т.е. берём указатель на класс/структуру/переменную и копируем N байт в файл. Пример: <syntaxhighlight lang="cpp"><br />
.......<br />
MyClass m;<br />
..............<br />
std::ofstream f("dump.bin", std::binary);<br />
f.write(&m, sizeof(m));<br />
f.close();<br />
........................<br />
</syntaxhighlight> <br />
<br />
Но этот метод сериализации имеет ряд ограничений и недостатков: <br />
<br />
*Допустимо использовать только для POD-структур (POD - Plain Old Data) и встроенных типов. Почему, будет понятно из следующих пунктов. <br />
*Если программистом описан конструктор, то компилятор вправе в класс добавить какие-то свои вспомогательные переменные, что превращает класс в не POD-структуру, на самом деле это не так страшно, но формально это так. <br />
*При сохранении указателей членов класса будут скопированы только адреса, хранимые указателями и, естественно, класс с указателями это не POD-тип <br />
*Если в классе объявленные виртуальные функции (или он унаследован от класса содержащего виртуальные функции), это приводит к тому, что класс будет дополнен указателем на таблицу виртуальных функций, и с этим указателем та же проблема, что и со всеми другими. Опять же не POD-тип. <br />
*Если ваш класс содержит внутри себя не POD типы или унаследован от не POD-типа, то ваш класс тоже не под тип, т.е. нет никакой гарантии, что копирование куска памяти позволит постановить состояние класса. <br />
*Различное выравнивание данных внутри класса может сделать невозможным перенос сохранённого класса на другую платформу или даже в программу, скомпилированную с другими параметрами компиляции. <br />
*Различный порядок байт не позволит переносить данные между такими платформами, как: x86 и PowerPC <br />
*И такая сериализация не даёт сохранить в удобочитаемой форме XML, текст или CSV<br />
<br />
Есть много ситуаций, когда создание дампа памяти - вполне допустимый метод сериализации, но также есть другое множество ситуаций, когда такой подход недопустим. <br />
<br />
Как только программист задумывается о сериализации данных, ему сразу же хочется выполнять сериализацию всего парой строк кода: легко и изящно, например, так: <syntaxhighlight lang="cpp"><br />
// вывести состояние класса и всех его членов.<br />
std::cout << myClass;<br />
<br />
// загрузить состояние класса из XML<br />
myXML >> myClass; <br />
</syntaxhighlight> <br />
<br />
И, естественно, самый простой способ быстро добиться результата - это использовать "велосипед", написанный другими. "Велосипед" возьмём хороший, многофункциональный. Он умеет выполнять сериализацию и десериализацию стандартных контейнеров, классов, указателей, ссылок и еще чего-то. Также он умеет сохранять, работать с различными форматами выходных данных: бинарный, текст, XML. Если очень хочется, то он может сохранить не только в поток, но и куда угодно, например, в вектор или в сокет или выкинуть в пропасть.<br />
<br />
Полное описание "велосипеда": http://www.boost.org/doc/libs/1_36_0/libs/serialization/doc/index.html <br />
<br />
Вот пример использования (взято из описания): <br />
<br />
<syntaxhighlight lang="cpp"><br />
/////////////////////////////////////////////////////////////<br />
// gps координаты<br />
//<br />
// illustrates serialization for a simple type<br />
//<br />
class gps_position<br />
{<br />
private:<br />
friend class boost::serialization::access;<br />
// When the class Archive corresponds to an output archive, the<br />
// & operator is defined similar to <<. Likewise, when the class Archive<br />
// is a type of input archive the & operator is defined similar to >>.<br />
template<class Archive><br />
void serialize(Archive & ar, const unsigned int version)<br />
{<br />
ar & degrees;<br />
ar & minutes;<br />
ar & seconds;<br />
}<br />
int degrees;<br />
int minutes;<br />
float seconds;<br />
public:<br />
gps_position(){};<br />
gps_position(int d, int m, float s) :<br />
degrees(d), minutes(m), seconds(s)<br />
{}<br />
};<br />
<br />
int main() {<br />
// create and open a character archive for output<br />
std::ofstream ofs("filename");<br />
<br />
// create class instance<br />
const gps_position g(35, 59, 24.567f);<br />
<br />
// save data to archive<br />
{<br />
boost::archive::text_oarchive oa(ofs);<br />
// write class instance to archive<br />
oa << g;<br />
// archive and stream closed when destructors are called<br />
}<br />
<br />
// ... some time later restore the class instance to its orginal state<br />
gps_position newg;<br />
{<br />
// create and open an archive for input<br />
std::ifstream ifs("filename");<br />
boost::archive::text_iarchive ia(ifs);<br />
// read class state from archive<br />
ia >> newg;<br />
// archive and stream closed when destructors are called<br />
}<br />
return 0;<br />
}<br />
</syntaxhighlight> <br />
<br />
Теперь по пунктам, как это работает: <br />
<br />
#Создаём внутри нашего класса метод serialize, получаем ссылку на архив и номер версии(можно по-разному сериализовать в зависимости от версии), если метод приватный, то добавляем в друзья class boost::serialization::access. Метод serialize будет вызываться при сериализации и десериализации.<br />
#Открываем файл и создаём архив (text_oarchive текстовый выходной архив), в нашем случае текстовый, архив - это тот самый класс, который выполняет основную работу.<br />
#Вызываем всеми любимый оператор &lt;&lt; - этот оператор вызывает метод serialize для классов или же внешние функции(они идут в комплекте) для встроенных типов и стандартных контейнеров.<br />
#text_oarchive::operator&lt;&lt; вызвал наш метод serialize и передал вовнутрь себя, тут возникает вопрос: почему внутри serialize используется оператор &amp;, а не &lt;&lt;? Ответ: потому что у выходного архива операторы &amp; и &lt;&lt; по сути это одно и тоже, у входного операторы &amp; и &gt;&gt; - одно и тоже. Т.е. ничто не мешает в коде поменять "ia &gt;&gt; newg;" на "ia &amp; newg;".<br />
#Если нужно изменить метод сериализации, достаточно поменять тип архива (для XML архива придётся сделать еще некоторою работу в методе serialize).<br />
<br />
На этом, в общем-то, работа по поддержке сериализации закончена.<br />
<br />
При желании, можно разделить методы для сериализации и десериализации. Кстати, boost::seralization гарантирует, что порядок байт при сериализации будет изменён, если потребуется, так что можно спокойно передать long с x86 на PowerPC. <br />
<br />
Немного поправленный пример использования и результаты работы: <br />
<br />
<syntaxhighlight lang="cpp"><br />
#include "stdafx.h"<br />
#include <iostream><br />
#include <fstream><br />
#include <string><br />
#include <fstream><br />
#include <vector><br />
<br />
// include headers that implement a archive in simple text format<br />
#include <boost/archive/text_oarchive.hpp><br />
#include <boost/archive/text_iarchive.hpp><br />
#include <boost/archive/binary_iarchive.hpp><br />
#include <boost/archive/binary_oarchive.hpp><br />
#include <boost/archive/xml_iarchive.hpp><br />
#include <boost/archive/xml_oarchive.hpp><br />
// включаем, чтобы сериализация работала с векторами<br />
#include <boost/serialization/vector.hpp><br />
// включаем, чтобы нормально проходила сериализация XML<br />
#include <boost/serialization/nvp.hpp><br />
<br />
class gps_position<br />
{<br />
private:<br />
friend class boost::serialization::access;<br />
<br />
template<class Archive><br />
void serialize(Archive & ar, const unsigned int version)<br />
{<br />
// то же, что и make_nvp, только имя параметра выводится в макросе<br />
ar & BOOST_SERIALIZATION_NVP(degrees);<br />
ar & BOOST_SERIALIZATION_NVP(minutes);<br />
ar & BOOST_SERIALIZATION_NVP(seconds);<br />
}<br />
int degrees;<br />
int minutes;<br />
float seconds;<br />
public:<br />
gps_position(){};<br />
gps_position(int d, int m, float s) :<br />
degrees(d), minutes(m), seconds(s)<br />
{}<br />
};<br />
<br />
template<typename TIArch, typename TOArch, typename TClass><br />
void TestArch(const std::string & file, int flags, const TClass & cont)<br />
{<br />
<br />
{ // Сериализуем<br />
std::ofstream ofs(file.c_str(), std::ios::out|flags);<br />
TOArch oa(ofs);<br />
// make_nvp создаёт пару имя-значение, которая отразится в XML<br />
// если не используем XML архив, то можно пару не создавать<br />
oa << boost::serialization::make_nvp("Test_Object", cont); <br />
}<br />
<br />
TClass newg;<br />
{ // Десериализуем<br />
std::ifstream ifs(file.c_str(), std::ios::in|flags);<br />
TIArch ia(ifs);<br />
ia >> boost::serialization::make_nvp("Test_Object",newg);<br />
}<br />
<br />
{ // Еще раз сериализуем, чтобы потом сравнить результаты двух сериализаций<br />
// и убедиться, что десериализациия прошла корректно<br />
std::ofstream ofs((file+".tmp").c_str(), std::ios::out|flags);<br />
TOArch oa(ofs);<br />
oa << boost::serialization::make_nvp("Test_Object", cont);<br />
}<br />
}<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
std::ofstream ofs("filename");<br />
<br />
std::vector<gps_position> v;<br />
v.push_back(gps_position(35, 59, 24.567f));<br />
v.push_back(gps_position(36, 60, 25.567f));<br />
v.push_back(gps_position(37, 61, 26.567f));<br />
<br />
using namespace boost::archive;<br />
TestArch<text_iarchive, text_oarchive>("text_arch.dump", 0, v);<br />
TestArch<binary_iarchive, binary_oarchive>("binary_arch.dump", std::ios::binary, v);<br />
TestArch<xml_iarchive, xml_oarchive>("xml_arch.dump", 0, v);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight> <br />
<br />
Файл text_arch.dump: <syntaxhighlight><br />
22 serialization::archive 3 0 0 3 0 0 35 59 24.566999 36 60 25.566999 37 61 26.566999<br />
</syntaxhighlight> <br />
<br />
Как видите, использование NVP никак не отразилось на внешнем виде архива. <br />
<br />
Файл xml_arch.dump: <syntaxhighlight><br />
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><br />
<!DOCTYPE boost_serialization><br />
<boost_serialization signature="serialization::archive" version="3"><br />
<Test_Object class_id="0" tracking_level="0" version="0"><br />
<count>3</count><br />
<item class_id="1" tracking_level="0" version="0"><br />
<degrees>35</degrees><br />
<minutes>59</minutes><br />
<seconds>24.566999</seconds><br />
</item><br />
<item><br />
<degrees>36</degrees><br />
<minutes>60</minutes><br />
<seconds>25.566999</seconds><br />
</item><br />
<item><br />
<degrees>37</degrees><br />
<minutes>61</minutes><br />
<seconds>26.566999</seconds><br />
</item><br />
</Test_Object><br />
</boost_serialization><br />
</syntaxhighlight> <br />
<br />
Бинарный архив приводить не стану&nbsp;:) не очень красочно, но занимает он 79 байт, из которых 39 - заголовок и 40 - полезная информация. <br />
<br />
<br> <br />
<br />
За универсальность boost::serialization придётся заплатить: <br />
<br />
*Во время компиляции шаблоны могут разворачиваться довольно долго.<br />
*Скорость: стек вызовов для сериализации какой-нибудь не слишком больной структурки, может быть просто ужасающим - вызовов 20-30.<br />
<br />
Но если вы не пишете систему массового обслуживания, то это то, что вам нужно, с помощью этой библиотеки можно даже реализовать маршалинг или RPC. <br />
<br />
<br> Надеюсь, в общих чертах понятно, как примерно работает сериализация и десериализация, и если понадобится, можно реализовать свою сериализацию. <br />
<br />
<br> Вот пример своей реализации архива, который я использую вместо boost:binary_iarchive (была ОЧЕНЬ важна скорость, а универсальность не очень, но для маршалинга хватает), делал так, чтобы можно было использовать один вместо другого без переделки кода: <br />
<br />
<syntaxhighlight lang="cpp"><br />
class binary_iarchive<br />
{<br />
public:<br />
typedef serialization::container container;<br />
typedef container::iterator iterator;<br />
<br />
container &cont_;<br />
size_t currentPos_;<br />
typedef boost::mpl::bool_<false> is_saving;<br />
binary_iarchive(container & cont, long = 0)<br />
: cont_(cont)<br />
, currentPos_(0)<br />
{<br />
}<br />
<br />
template<typename T><br />
binary_iarchive & operator>>(T & val)<br />
{<br />
deserialize_impl(val);<br />
return *this;<br />
}<br />
<br />
void reset()<br />
{<br />
resetPos();<br />
cont_.clear();<br />
}<br />
<br />
template<typename T><br />
inline void raw_read(T beginPos, size_t len)<br />
{<br />
if (static_cast<size_t>(cont_.size() - currentPos_) < len)<br />
throw std::runtime_error("No more data");<br />
<br />
iterator pos = cont_.begin() + currentPos_;<br />
iterator endPos = pos + len;<br />
std::copy(pos, endPos, beginPos);<br />
currentPos_ = currentPos_ + len;<br />
}<br />
private:<br />
// Fundamental<br />
template<typename T><br />
inline void deserialize_impl(T & val, typename boost::enable_if<boost::is_fundamental<T> >::type* dummy = 0)<br />
{<br />
raw_read(reinterpret_cast<char*>(&val), sizeof(T));<br />
}<br />
<br />
//Classes<br />
template<typename T><br />
inline void deserialize_impl(T & val, typename boost::enable_if<boost::is_class<T> >::type* dummy = 0)<br />
{<br />
deserialize_class(*this, val);<br />
}<br />
};<br />
</syntaxhighlight> <br />
<br />
Кое-что порезал, чтобы не расслаблялись&nbsp;:) <br />
<br />
[[Category:FAQ]] [[Category:FAQ:ANSI_CPP]] [[Category:FAQ:STL]] [[Category:FAQ:STL_BOOST]]</div>Selhttps://wiki.shelek.ru/index.php?title=FAQ:STL:C%2B%2B_%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&diff=459FAQ:STL:C++ сериализация данных2008-09-30T08:26:08Z<p>Sel: </p>
<hr />
<div>Иногда нужно сохранить состояние класса в файл, передать состояние класса по сети. Подобные задачи обычно решает сериализация. <br />
<br />
Говоря о сериализации, я подразумиваю механизмы перевода некоторого класса, структуры или набора переменных в определённый формат (бинарный, текстовый, XML, HTML и т.д.), а также сам процесс перевода. Десериализация - процессы и механизмы обратные сериализации (восстановление состояния из внешнего источника). <br />
<br />
Самый простой способ, к которому чаще всего прибегают молодые программисты, - это простое копирование памяти в файл или еще куда-то. Т.е. берём указатель на класс/структуру/переменную и копируем N байт в файл. Пример: <syntaxhighlight lang="cpp"><br />
.......<br />
MyClass m;<br />
..............<br />
std::ofstream f("dump.bin", std::binary);<br />
f.write(&m, sizeof(m));<br />
f.close();<br />
........................<br />
</syntaxhighlight> <br />
<br />
Но этот метод сериализации имеет ряд ограничений и недостатков: <br />
<br />
*Допустимо использовать только для POD-структур (POD - Plain Old Data) и встроенных типов. Почему, будет понятно из следующих пунктов. <br />
*Если программистом описан конструктор, то компилятор вправе в класс добавить какие-то свои вспомогательные переменные, что превращает класс в не POD-структуру, на самом деле это не так страшно, но формально это так. <br />
*При сохранении указателей членов класса будут скопированы только адреса, хранимые указателями и, естественно, класс с указателями это не POD-тип <br />
*Если в классе объявленные виртуальные функции (или он унаследован от класса содержащего виртуальные функции), это приводит к тому, что класс будет дополнен указателем на таблицу виртуальных функций, и с этим указателем та же проблема, что и со всеми другими. Опять же не POD-тип. <br />
*Если ваш класс содержит внутри себя не POD типы или унаследован от не POD-типа, то ваш класс тоже не под тип, т.е. нет никакой гарантии, что копирование куска памяти позволит постановить состояние класса. <br />
*Различное выравнивание данных внутри класса может сделать невозможным перенос сохранённого класса на другую платформу или даже в программу, скомпилированную с другими параметрами компиляции. <br />
*Различный порядок байт не позволит переносить данные между такими платформами, как: x86 и PowerPC <br />
*И такая сериализация не даёт сохранить в удобочитаемой форме XML, текст или CSV<br />
<br />
Есть много ситуаций, когда создание дампа памяти - вполне допустимый метод сериализации, но также есть другое множество ситуаций, когда такой подход недопустим. <br />
<br />
Как только программист задумывается о сериализации данных, ему сразу же хочется выполнять сериализацию всего парой строк кода: легко и изящно, например, так: <syntaxhighlight lang="cpp"><br />
// вывести состояние класса и всех его членов.<br />
std::cout << myClass;<br />
<br />
// загрузить состояние класса из XML<br />
myXML >> myClass; <br />
</syntaxhighlight> <br />
<br />
И, естественно, самый простой способ быстро добиться результата - это использовать "велосипед", написанный другими. "Велосипед" возьмём хороший, многофункциональный. Он умеет выполнять сериализацию и десериализацию стандартных контейнеров, классов, указателей, ссылок и еще чего-то. Также он умеет сохранять, работать с различными форматами выходных данных: бинарный, текст, XML. Если очень хочется, то он может сохранить не только в поток, но и куда угодно, например, в вектор или в сокет или выкинуть в пропасть.<br />
<br />
Полное описание "велосипеда": http://www.boost.org/doc/libs/1_36_0/libs/serialization/doc/index.html <br />
<br />
Вот пример использования (взято из описания): <br />
<br />
<syntaxhighlight lang="cpp"><br />
/////////////////////////////////////////////////////////////<br />
// gps координаты<br />
//<br />
// illustrates serialization for a simple type<br />
//<br />
class gps_position<br />
{<br />
private:<br />
friend class boost::serialization::access;<br />
// When the class Archive corresponds to an output archive, the<br />
// & operator is defined similar to <<. Likewise, when the class Archive<br />
// is a type of input archive the & operator is defined similar to >>.<br />
template<class Archive><br />
void serialize(Archive & ar, const unsigned int version)<br />
{<br />
ar & degrees;<br />
ar & minutes;<br />
ar & seconds;<br />
}<br />
int degrees;<br />
int minutes;<br />
float seconds;<br />
public:<br />
gps_position(){};<br />
gps_position(int d, int m, float s) :<br />
degrees(d), minutes(m), seconds(s)<br />
{}<br />
};<br />
<br />
int main() {<br />
// create and open a character archive for output<br />
std::ofstream ofs("filename");<br />
<br />
// create class instance<br />
const gps_position g(35, 59, 24.567f);<br />
<br />
// save data to archive<br />
{<br />
boost::archive::text_oarchive oa(ofs);<br />
// write class instance to archive<br />
oa << g;<br />
// archive and stream closed when destructors are called<br />
}<br />
<br />
// ... some time later restore the class instance to its orginal state<br />
gps_position newg;<br />
{<br />
// create and open an archive for input<br />
std::ifstream ifs("filename");<br />
boost::archive::text_iarchive ia(ifs);<br />
// read class state from archive<br />
ia >> newg;<br />
// archive and stream closed when destructors are called<br />
}<br />
return 0;<br />
}<br />
</syntaxhighlight> <br />
<br />
Теперь по пунктам, как это работает: <br />
<br />
#Создаём внутри нашего класса метод serialize, получаем ссылку на архив и номер версии(можно по-разному сериализовать в зависимости от версии), если метод приватный, то добавляем в друзья class boost::serialization::access. Метод serialize будет вызываться при сериализации и десериализации.<br />
#Открываем файл и создаём архив (text_oarchive текстовый выходной архив), в нашем случае текстовый, архив - это тот самый класс, который выполняет основную работу.<br />
#Вызываем всеми любимый оператор &lt;&lt; - этот оператор вызывает метод serialize для классов или же внешние функции(они идут в комплекте) для встроенных типов и стандартных контейнеров.<br />
#text_oarchive::operator&lt;&lt; вызвал наш метод serialize и передал вовнутрь себя, тут возникает вопрос: почему внутри serialize используется оператор &amp;, а не &lt;&lt;? Ответ: потому что у выходного архива операторы &amp; и &lt;&lt; по сути это одно и тоже, у входного операторы &amp; и &gt;&gt; - одно и тоже. Т.е. ничто не мешает в коде поменять "ia &gt;&gt; newg;" на "ia &amp; newg;".<br />
#Если нужно изменить метод сериализации, достаточно поменять тип архива (для XML архива придётся сделать еще некоторою работу в методе serialize).<br />
<br />
На этом, в общем-то, работа по поддержке сериализации закончена.<br />
<br />
При желании, можно разделить методы для сериализации и десериализации. Кстати, boost::seralization гарантирует, что порядок байт при сериализации будет изменён, если потребуется, так что можно спокойно передать long с x86 на PowerPC. <br />
<br />
Немного поправленный пример использования и результаты работы: <br />
<br />
<syntaxhighlight lang="cpp"><br />
#include "stdafx.h"<br />
#include <iostream><br />
#include <fstream><br />
#include <string><br />
#include <fstream><br />
#include <vector><br />
<br />
// include headers that implement a archive in simple text format<br />
#include <boost/archive/text_oarchive.hpp><br />
#include <boost/archive/text_iarchive.hpp><br />
#include <boost/archive/binary_iarchive.hpp><br />
#include <boost/archive/binary_oarchive.hpp><br />
#include <boost/archive/xml_iarchive.hpp><br />
#include <boost/archive/xml_oarchive.hpp><br />
// включаем, чтобы сериализация работала с векторами<br />
#include <boost/serialization/vector.hpp><br />
// включаем, чтобы нормально проходила сериализация XML<br />
#include <boost/serialization/nvp.hpp><br />
<br />
class gps_position<br />
{<br />
private:<br />
friend class boost::serialization::access;<br />
<br />
template<class Archive><br />
void serialize(Archive & ar, const unsigned int version)<br />
{<br />
// то же, что и make_nvp, только имя параметра выводится в макросе<br />
ar & BOOST_SERIALIZATION_NVP(degrees);<br />
ar & BOOST_SERIALIZATION_NVP(minutes);<br />
ar & BOOST_SERIALIZATION_NVP(seconds);<br />
}<br />
int degrees;<br />
int minutes;<br />
float seconds;<br />
public:<br />
gps_position(){};<br />
gps_position(int d, int m, float s) :<br />
degrees(d), minutes(m), seconds(s)<br />
{}<br />
};<br />
<br />
template<typename TIArch, typename TOArch, typename TClass><br />
void TestArch(const std::string & file, int flags, const TClass & cont)<br />
{<br />
<br />
{ // Сериализуем<br />
std::ofstream ofs(file.c_str(), std::ios::out|flags);<br />
TOArch oa(ofs);<br />
// make_nvp создаёт пару имя-значение, которая отразится в XML<br />
// если не используем XML архив, то можно пару не создавать<br />
oa << boost::serialization::make_nvp("Test_Object", cont); <br />
}<br />
<br />
TClass newg;<br />
{ // Десериализуем<br />
std::ifstream ifs(file.c_str(), std::ios::in|flags);<br />
TIArch ia(ifs);<br />
ia >> boost::serialization::make_nvp("Test_Object",newg);<br />
}<br />
<br />
{ // Еще раз сериализуем, чтобы потом сравнить результаты двух сериализаций<br />
// и убедиться, что десериализациия прошла корректно<br />
std::ofstream ofs((file+".tmp").c_str(), std::ios::out|flags);<br />
TOArch oa(ofs);<br />
oa << boost::serialization::make_nvp("Test_Object", cont);<br />
}<br />
}<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
std::ofstream ofs("filename");<br />
<br />
std::vector<gps_position> v;<br />
v.push_back(gps_position(35, 59, 24.567f));<br />
v.push_back(gps_position(36, 60, 25.567f));<br />
v.push_back(gps_position(37, 61, 26.567f));<br />
<br />
using namespace boost::archive;<br />
TestArch<text_iarchive, text_oarchive>("text_arch.dump", 0, v);<br />
TestArch<binary_iarchive, binary_oarchive>("binary_arch.dump", std::ios::binary, v);<br />
TestArch<xml_iarchive, xml_oarchive>("xml_arch.dump", 0, v);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight> <br />
<br />
Файл text_arch.dump: <syntaxhighlight><br />
22 serialization::archive 3 0 0 3 0 0 35 59 24.566999 36 60 25.566999 37 61 26.566999<br />
</syntaxhighlight> <br />
<br />
Как видите, использование NVP никак не отразилось на внешнем виде архива. <br />
<br />
Файл xml_arch.dump: <syntaxhighlight><br />
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><br />
<!DOCTYPE boost_serialization><br />
<boost_serialization signature="serialization::archive" version="3"><br />
<Test_Object class_id="0" tracking_level="0" version="0"><br />
<count>3</count><br />
<item class_id="1" tracking_level="0" version="0"><br />
<degrees>35</degrees><br />
<minutes>59</minutes><br />
<seconds>24.566999</seconds><br />
</item><br />
<item><br />
<degrees>36</degrees><br />
<minutes>60</minutes><br />
<seconds>25.566999</seconds><br />
</item><br />
<item><br />
<degrees>37</degrees><br />
<minutes>61</minutes><br />
<seconds>26.566999</seconds><br />
</item><br />
</Test_Object><br />
</boost_serialization><br />
</syntaxhighlight> <br />
<br />
Бинарный архив приводить не стану&nbsp;:) не очень красочно, но занимает он 79 байт, из которых 39 - заголовок и 40 - полезная информация. <br />
<br />
<br> <br />
<br />
За универсальность boost::serialization придётся заплатить: <br />
<br />
*Во время компиляции шаблоны могут разворачиваться довольно долго.<br />
*Скорость: стек вызовов для сериализации какой-нибудь не слишком больной структурки, может быть просто ужасающим - вызовов 20-30.<br />
<br />
Но если вы не пишете систему массового обслуживания, то это то, что вам нужно, с помощью этой библиотеки можно даже реализовать маршалинг или RPC. <br />
<br />
<br> Надеюсь, в общих чертах понятно, как примерно работает сериализация и десериализация, и если понадобится, можно реализовать свою сериализацию. <br />
<br />
<br> Вот пример своей реализации архива, который я использую вместо boost:binary_iarchive (была ОЧЕНЬ важна скорость, а универсальность не очень, но для маршалинга хватает), делал так, чтобы можно было использовать один вместо другого без переделки кода: <br />
<br />
<syntaxhighlight lang="cpp"><br />
class binary_iarchive<br />
{<br />
public:<br />
typedef serialization::container container;<br />
typedef container::iterator iterator;<br />
<br />
container &cont_;<br />
size_t currentPos_;<br />
typedef boost::mpl::bool_<false> is_saving;<br />
binary_iarchive(container & cont, long = 0)<br />
: cont_(cont)<br />
, currentPos_(0)<br />
{<br />
}<br />
<br />
template<typename T><br />
binary_iarchive & operator>>(T & val)<br />
{<br />
deserialize_impl(val);<br />
return *this;<br />
}<br />
<br />
void reset()<br />
{<br />
resetPos();<br />
cont_.clear();<br />
}<br />
<br />
template<typename T><br />
inline void raw_read(T beginPos, size_t len)<br />
{<br />
if (static_cast<size_t>(cont_.size() - currentPos_) < len)<br />
throw std::runtime_error("No more data");<br />
<br />
iterator pos = cont_.begin() + currentPos_;<br />
iterator endPos = pos + len;<br />
std::copy(pos, endPos, beginPos);<br />
currentPos_ = currentPos_ + len;<br />
}<br />
private:<br />
// Fundamental<br />
template<typename T><br />
inline void deserialize_impl(T & val, typename boost::enable_if<boost::is_fundamental<T> >::type* dummy = 0)<br />
{<br />
raw_read(reinterpret_cast<char*>(&val), sizeof(T));<br />
}<br />
<br />
//Classes<br />
template<typename T><br />
inline void deserialize_impl(T & val, typename boost::enable_if<boost::is_class<T> >::type* dummy = 0)<br />
{<br />
deserialize_class(*this, val);<br />
}<br />
};<br />
</syntaxhighlight> <br />
<br />
Кое-что порезал, чтобы не расслаблялись&nbsp;:) <br />
<br />
[[Category:FAQ]] [[Category:FAQ:ANSI_CPP]] [[Category:FAQ:STL]] [[Category:FAQ:STL_BOOST]]</div>Sel