/*! * Unsafe load * * \throws ExceptionProtocol the content of the vector is not serializable * \throws ExceptionInvalidArgument not a Vector * \throws ExceptionRuntime impossible to read an XML element * \throws ExceptionNotFound unknown type * * \param[in] el the element to load */ void Vector::Deserialize(xml::Element &el) { if (el.GetValue() != getClassName()) { throw ExceptionInvalidArgument(StringUTF8("void Vector::Deserialize(xml::Element &el): ") + _("Wrong XML element.")); } std::multimap<int, SObject> xmllist; for (xml::Element te = el.BeginElement(); te != el.EndElement(); ++te) { SObject d(nullptr); try { d = DataFactory::CreateData(te); } catch (crn::Exception &) { // XXX throw? CRNWarning(String(U"void Vector::Deserialize" U"(xml::Element &el): ") + String(_("Unknown XML element: ")) + te.GetValue()); } if (!d) continue; int index; try { index = te.GetAttribute<int>("vector_index", false); } catch (...) { index = int(xmllist.size()); } xmllist.insert(std::make_pair(index, d)); } Clear(); for (auto & elem : xmllist) data.push_back(elem.second); ShrinkToFit(); }
/*! * Initializes the object from an XML element. Unsafe. * * \throws ExceptionInvalidArgument not a StringUTF8 * \throws ExceptionDomain no CDATA found * * \param[in] el the XML element to read */ void StringUTF8::Deserialize(xml::Element &el) { if (el.GetValue() != "StringUTF8") { throw ExceptionInvalidArgument(StringUTF8("void StringUTF8::deserialize(xml::Element &el): ") + _("Wrong XML element.")); } xml::Node c(el.GetFirstChild()); if (!c) return; // no content xml::Text t(c.AsText()); // may throw *this = t.GetValue(); ShrinkToFit(); }
/*! * Creates and initializes a CRNData from an XML element * * \throws ExceptionInvalidArgument null XML element * \throws ExceptionRuntime impossible to read the XML element * \throws ExceptionNotFound unknown type * * \param[in] el the XML element to use for initialization * \return a pointer to the newly created object, or nullptr if failed */ UObject DataFactory::CreateData(xml::Element &el) { if (!el) { throw ExceptionInvalidArgument(StringUTF8("SObject DataFactory::CreateData(xml::Element &el): ") + _("Null XML element.")); } const StringUTF8 typ = el.GetValue(); if (typ.IsEmpty()) { throw ExceptionRuntime(StringUTF8("SObject DataFactory::CreateData(xml::Element &el): ") + _("Cannot read element.")); } return getInstance().createObject(typ, el); // may throw }