Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 131

Автор Π”. БтСфСнс

ΠœΠ΅Ρ‚ΠΎΠ΄ evaluate() класса XPathEvaluator Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ XObjectPtr, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния выраТСния XPath. Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся XObjectPtr, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ Π΅Π³ΠΎ разымСнования с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ XObject ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° getType(); Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° num(), boolean(), str() ΠΈΠ»ΠΈ nodeset(). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.23 прСдставляСт Π½Π°Π±ΠΎΡ€ ΡƒΠ·Π»ΠΎΠ², я использовал ΠΌΠ΅Ρ‚ΠΎΠ΄ nodeset() для получСния ссылки Π½Π° NodeRefListBase, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт доступ ΠΊ ΡƒΠ·Π»Π°ΠΌ Π² Π½Π°Π±ΠΎΡ€Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² getLength() ΠΈ item(). ΠœΠ΅Ρ‚ΠΎΠ΄ item() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠ·Π΅Π» XalanNode, ΠΌΠ΅Ρ‚ΠΎΠ΄ getNodeValue() ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку с интСрфСйсом, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ Π½Π° интСрфСйс std::basic_string.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ XPath обСспСчиваСт простой способ опрСдСлСния мСстополоТСния ΡƒΠ·Π»ΠΎΠ² Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ XML, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ СстСствСнный вопрос ΠΎ возмоТности примСнСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Xalan XPath для получСния экзСмпляров xercesc::DOMNode ΠΈΠ· xercesc::DOMDocument. На самом Π΄Π΅Π»Π΅ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π½Π΅ совсСм ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π° ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡƒΠ·Π»Ρ‹ xercesc::DOMNodes, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΈΠΌ способом, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄Π΅Ρ€Π΅Π²ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML с возмоТностями Ρ‚ΠΎΠ»ΡŒΠΊΠΎ чтСния, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΎΡ‚ примСнСния XPath Π² качСствС срСдства манипулирования DOM. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ способы, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ достаточно слоТны ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ опасны.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Pathan Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ XPath, совмСстимый с Xerces ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π»Π΅Π³ΠΊΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Xerces DOM. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.24 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Pathan для опрСдСлСния мСста располоТСния ΠΈ удалСния ΡƒΠ·Π»Π° слона Herby ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.1, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ вычислСния XPath-выраТСния animalList/animal[child::name='Herby']. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ 14.10 ясно ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, насколько ΠΌΠΎΡ‰Π½Ρ‹ΠΌ являСтся язык XPath.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.24. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ мСстополоТСния ΡƒΠ·Π»Π° ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Pathan

#include <exception>

#include <iostream> // cout

#include <xercesc/dom/DOM.hpp>

#include <xercesc/framework/LocalFileFormatTarget.hpp>

#include <xercesc/util/PlatformUtils.hpp>

#include <pathan/XPathNamespace.hpp>

#include <pathan/XPathResult.hpp>

<include <pathan/XPathEvaluator.hpp>

#include <pathan/XPathExpression.hpp>

#include "xerces_strings.hpp" // ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.4


using namespace std;

using namespace xercesc;


/*

 * ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ XercesInitializer, ΠΊΠ°ΠΊ это сдСлано Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.8, Π° Ρ‚Π°ΠΊΠΆΠ΅

 * CircusFrrorHandler ΠΈ DOMPtr, ΠΊΠ°ΠΊ это сдСлано Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.10

 */


int main() {

 try {

  // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Xerces ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ DOMImplementation.

  XercesInitializer init;

  DOMImplementation* impl =

   DOMImplementationRegistry::getDOMImplementation(

    fromNative("LS").c_str()

   );

  if (impl == 0) {

   cout << "couldn't create DOM implementation\n";

   return EXIT_FAILURE;

  }

  // Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DOMBuilder для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°

  // Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° animals.xml.

  DOMPtr<DOMBuilder> parser =

   static cast<DOMImplementationLS*>(impl)-> createDOMBuilder(

    DOMImplementationLS::MODE_SYNCHRONOUS, 0

   );

  CircusErrorHandler err;

  parser->setErrorHandler(&err);

  // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·

  animals.xml. DOMDocument* doc =

   parser->parseURI("animals.xml");

  DOMElement* animalList = doc->getDocumentElement();

  // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

  auto_ptr<XPathEvaluator>

   evaluator(XPathEvaluator::createEvaluator());

  auto_ptr<XPathNSResolver>

   resolver(evaluator->createNSResolver(animalList));

  auto_ptr<XPathExpression> xpath(

   evaluator->createExpression(FromNative(

    "animalList/animal[child::name='Herby']" ).c_str(), resolver.get()

   )

  );

  auto_ptr<XPathEvaluator> evaluator(XPathEvaluator::createEvaluator());

  auto_ptr<XPathNSResolver> resolver(evaluator->createNSResolver(animalList));

  auto_ptr<XPathExpression> xpath(evaluator->createExpression(

   fromNative("animalList/animal[child::name='Herby']").c_str(),

   resolver.get()

  ));

  // Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

  XPathResult* result = xpath->evaluate(doc,

   XPathResult::ORDERED_NODE_ITERATOR_TYPE, 0

  );

  DOMNode* herby;

  if (herby = result->iterateNext()) {

   animalList->removeChild(herby);

   herby->release(); // optional

  }

  // Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DOMWriter для сохранСния animals.xml

  DOMPtr<DOMWriter> writer =

   static_cast<DOMImplementationLS->(impl)->createDOMWriter();

  writer->setErrorHandler(&err);

  // Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ animals.xml.

  LocalFileFormatTarget file("circus.xml");

  writer->writeNode(&file, *animalList);

 } catch (const DOMException& e) {

  cout << toNative(e.getMessage()) << "\n";

  return EXIT_FAILURE;

 } catch (const XPathException &e) {

  cout << e.getString() << "\n";

  return EXIT_FAILURE;

 } catch (const exception& e) {

  cout << e.what() << "\n";

  return EXIT_FAILURE;

 }

}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.24 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Pathan 1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ XPath 1.0; Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Xalan Π² настоящСС врСмя поддСрТиваСтся ΠΈΠΌΠ΅Π½Π½ΠΎ эта вСрсия. Pathan 2, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² настоящСС врСмя доступСн Π² Π±Π΅Ρ‚Π°-вСрсии, обСспСчиваСт ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ XPath 2.0. Pathan 2 прСдставляСт собой Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ стандарта XPath; я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Pathan 2 вмСсто Pathan 1, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ станСт доступна Π½Π΅ Π±Π΅Ρ‚Π°-вСрсия.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚ 14.7.

14.9. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ XML для сохранСния ΠΈ восстановлСния Π½Π°Π±ΠΎΡ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

ВрСбуСтся ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сохранСния Π½Π°Π±ΠΎΡ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² C++ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ XML ΠΈ считывания ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ.

РСшСниС

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Boost Serialization. Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ классы, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π°Ρ€Ρ…ΠΈΠ²Π°ΠΌΠΈ. Для использования этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сначала ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π²Π°ΡˆΠΈΡ… классов сСриализуСмым (serializable), Ρ‡Ρ‚ΠΎ просто ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ записи экзСмпляров класса Π² Π°Ρ€Ρ…ΠΈΠ² (это называСтся сСриализациСй) ΠΈ ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ считывания Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ (это называСтся дСсСриализациСй). Π—Π°Ρ‚Π΅ΠΌ Π½Π° этапС выполнСния Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ваши ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Π°Ρ€Ρ…ΠΈΠ²Π΅ XML, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <<, ΠΈ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ >>.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ класс сСриализуСмым, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ шаблон Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° serialize со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ сигнатурой.

template<typename Archive>

void serialize(Archive& ar, const unsigned int version);

Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ serialize Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ запись ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΠΎΠ³ΠΎ-Ρ‡Π»Π΅Π½Π° класса Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π°Ρ€Ρ…ΠΈΠ² Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Ρ‹ «имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ &. НапримСр, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ экзСмпляры класса Contact ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.2, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ serialize, ΠΊΠ°ΠΊ это сдСлано Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.25.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.25. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ сСриализации Π² класс Contact ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.2

#include <boost/serialization/nvp.hpp> // ΠΏΠ°Ρ€Π° "имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅"


class Contact {

 ...

private:

 friend class boost::serialization::access;

 template<typename Archive>

 void serialize(Archive& ar, const unsigned int version) {

  // Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ (ΠΈΠ»ΠΈ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ) ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π΄Π°Π½Π½ΠΎΠ΅-Ρ‡Π»Π΅Π½ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Ρ‹ имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

  using boost::serialization::make_nvp;

  ar & make_nvp("name", name_);

  ar & make_nvp("phone", phone_);

 }

...

};

Аналогично ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса Animal ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.2, ΠΊΠ°ΠΊ это сдСлано Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.26.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.26. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ сСриализации для класса Animal ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.2

...

// Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ сСриализации для boost::gregorian::date

#include <boost/date_time/gregorian/greg_serialize.hpp>

...


class Contact {

 ...

private:

 friend class boost::serialization::access;

 template<typename Archive>

 void serialize(Archive& ar, const unsigned int version) {

  // Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ (ΠΈΠ»ΠΈ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ) ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π΄Π°Π½Π½ΠΎΠ΅-Ρ‡Π»Π΅Π½ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Ρ‹ имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

  using boost::serialization::make_nvp;

  ar & make_nvp("name", name_);

  ar & make_nvp("species", species_);

  ar & make_nvp("dateOfBirth", dob_);

  ar & make_nvp("veterinarian", vet_);

  ar & make_nvp("trainer", trainer_);

 }

 ...

};

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Animal, создавая Π°Ρ€Ρ…ΠΈΠ² XML Ρ‚ΠΈΠΏΠ° boost::archive::xml_oarchive ΠΈ записывая ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠΌ Π² Π°Ρ€Ρ…ΠΈΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <<. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ xml_oarchive Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ std::ostream; часто этим Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для записи Π² Ρ„Π°ΠΉΠ», ΠΎΠ΄Π½Π°ΠΊΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС для записи Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ рСсурс любого Ρ‚ΠΈΠΏΠ°. ПослС сСриализации экзСмпляра Animal Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, конструируя Π°Ρ€Ρ…ΠΈΠ² XML Ρ‚ΠΈΠΏΠ° boost::archive::xml_iarchive, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ Π΅Π³ΠΎ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ самому рСсурсу, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ использовался ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Ρ…ΠΈΠ²ΠΎΠΌ, ΠΈ примСняя ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ >>.