Re: [Boost-users] [Serialization, XML] - how to get info "where am i?" in serialization helper (encoding is not recursive)?
Hi Robert,
when i use this xml_oarchive wrapper:
/***************************
*
* xml_oarchive wrapper
*
***************************/
template <class Archive>
class xml_oarchive_orga_impl :
public xml_oarchive_impl<Archive>
{
#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
public:
#else
friend class detail::interface_oarchive<Archive>;
friend class xml_oarchive_impl<Archive>;
friend class save_access;
protected:
#endif
xml_oarchive_orga_impl(std::ostream & os, unsigned int flags) :
xml_oarchive_impl<Archive>(os, flags)
{ };
~xml_oarchive_orga_impl() { } ;
template<class T>
void save_override(
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
const
#endif
boost::serialization::nvp<T> & t,
int i
){
MakeNVPPathConcat(t.name());
xml_oarchive_impl<Archive>::save_override(t, i);
}
};
// do not derive from this class. If you want to extend this functionality
// via inhertance, derived from xml_iarchive_orga_impl instead. This will
// preserve correct static polymorphism.
class xml_oarchive_orga :
public xml_oarchive_orga_impl
-----Ursprüngliche Nachricht----- Von: "Frank Bergemann"
Gesendet: 23.04.07 08:25:14 An: boost-users@lists.boost.org Betreff: Re: [Boost-users] [Serialization, XML] - how to get info "where am i?" in serialization helper (encoding is not recursive)?
Hi Robert,
-----Ursprüngliche Nachricht----- Von: boost-users@lists.boost.org Gesendet: 23.04.07 01:37:58 An: boost-users@lists.boost.org Betreff: Re: [Boost-users] [Serialization, XML] - how to get info "where am i?" in serialization helper (encoding is not recursive)?
Frank Bergemann wrote:
i use an external XML format for configuration of CORBA (MICO) data and managed to align that with boost::serialization (To not write my own encoder/decoder and to minimize efforts for my module, in case the customer wants more CORBA objects/methods in future. Actually i think it would be a good options to let generate the boost::serialitzation helper file directly by MICO idl compiler.)
What is the boost::serialitzation helper file? Oh maybe its what i called a wrapper
i meant the serialize(...) functions. The ones, which are related to the CORBA data types are plain simple now, directly related to the IDL file - e.g.
template<class Archive> void serialize(Archive & ar, ::EmiHLRINData::HLRINData_V4::DCsiList_s &pInstance, const unsigned int version) { ar & make_nvp_wrapper( "d_csi_opt", pInstance.d_csi_opt ); ar & make_nvp_wrapper( "neg_ph_vlr", pInstance.neg_ph_vlr ); ar & make_nvp_wrapper( "cap", pInstance.cap ); ar & make_nvp_wrapper( "d_csi", pInstance.d_csi ); ar & make_nvp_wrapper( "lowph", pInstance.lowph ); ar & make_nvp_wrapper( "lowac", pInstance.lowac ); }
I saved it in a file.cc.template and let it be expanded for the Archives i use (e.g. file_xml_oarchive.cc). So i can pre-compile the whole stuff in a library. And only re-compile, if the IDL files change. ( Using templates it took ages to compile my module :-) )
OK, for this now i have to check, that the (external, non by boost::serialization generated) XML image is _actually_ compliant with C/C++ data structures - especially for dynamic sized data. That is also covered now, the checks do fine.
How much time/effort did it take to do this?
Was not that much. I have a XML "catalogue" of CORBA commands, for each cmd referring to CORBA object, method of object & related root data objects (holding event/subscriber variables inside, to be expanded). Then I use boost::serialization save(xml_oarchive,...) to create a *dummy* reference object. I traverse this one with some XML lib. And while traversing, i lookup corresponding positions in my XML formatted configuration file (for data to fill-into the boost::serialization image) and update the value in boost::serialization XML image. Then i use load(xml_oarchive, ...) to create the C/C++ object, populated with my "real" data now. I save all the objects needed for a command in a boost::any container (for invoking a generic CORBA-object/method dispatcher). All this alignment stuff will be shifted to process startup phase. In the end it's better than writing my own XML decoder for each CORBA data object. It is much more generic using your boost::serialization lib :-)
But what i didn't manage is to get the _location_ of error in the XML file - in case there is an error.
Hmmm - location as ? point to the line/character? current name? or ?
location in XML data structure (XML-path).
opsc_hlr :2204 084723:D:### invoked for <value> opsc_hlr :2204 084723:D:### c'tor opsc_hlr :2204 084723:D:### done for <value> opsc_hlr :2204 084723:D:### d'tor
So there is no recursion(???).
Is there another way to get a "where am i" information within a serialize (load/save) helper?
make_...wrapper is not recurssive, save/load are.
I would derive from xml_?archive and override the save(NVP(T)..) and/or load(NVP...) to capture/whatever the tags as they are read/writting. Don't forget to call the original save/load.
Could you pls refer to short example for deriving from xml_?archive ?
Robert Ramey
\Frank
_______________________________________________________________ SMS schreiben mit WEB.DE FreeMail - einfach, schnell und kostenguenstig. Jetzt gleich testen! http://f.web.de/?mc=021192
I have just recently written classes where I derive from xml_oarchive and xml_iarchive, and one of the extensions I added is to report the stream location and other context (such as the tag name) when there's an exception. I originally wrote the derived archives to cache the serialized name/value pairs into a configuration "dictionary". The idea is to be able to modify the dictionary at runtime, such as in a configuration editor, and from the modified configuration restore or reconfigure application objects. I have attached the implementation file, in case you'd like to borrow the exception handling code, or whatever. The references to a ConfigNode class are for the configuration dictionary, but the archives can still be used with regular iostreams to get the exception location reporting. It might take some time to parse everything, and I'm sorry I don't have time to explain it further, but maybe it will be a useful example. As an aside, I also added support to these archives for embedding XML data in CDATA sections rather than escaping them. The attached xml_cdata.h is the wrapper for that. gary
participants (2)
-
Frank Bergemann
-
Gary Granger