Oleg Fedorov wrote:
> А пример такого xml файла и кода для работы с ним
> можно?
Самый простой пример (без сохранения иерархии и relationship) - конфиг:
struct Config
{
enum Domain_e
{
DOMAIN_ART = 0
, DOMAIN_GAME_DESIGN = 1
, DOMAIN_PROGRAMMING = 2
, DOMAIN_SOUND = 3
};
std::string m_sUser;
std::string m_sPassword;
Domain_e m_eDomain;
bool m_bFileSystemFlat;
boost::filesystem::path m_sMediaPath;
int m_iAutosavePeriod; // minutes
boost::filesystem::path m_sAutosavePath;
struct Layout_c : public serialization::Layout_c < Config >
{
Layout_c()
{
Simple ( "user", &Config::m_sUser, "" );
Simple ( "password", &Config::m_sPassword, "" );
Enum ( "domain", &Config::m_eDomain, DOMAIN_GAME_DESIGN )
.Enumerator( DOMAIN_ART, "art" )
.Enumerator( DOMAIN_GAME_DESIGN, "game_design" )
.Enumerator( DOMAIN_PROGRAMMING, "programming" )
.Enumerator( DOMAIN_SOUND, "sound" )
;
Simple ( "filesystem_flat", &Config::m_bFileSystemFlat, true );
Simple ( "media_path", &Config::m_sMediaPath, "" );
Simple ( "autosave_period", &Config::m_iAutosavePeriod, 10 );
Simple ( "autosave_path", &Config::m_sAutosavePath, "" );
}
};
};
<?xml version="1.0" encoding="windows-1251"?>
<SkyStudio>
<Configuration>
<user>loyso</user>
<domain>programming</domain>
<filesystem_flat>true</filesystem_flat>
<media_path>C:/Dev/Repositories/media</media_path>
<autosave_period>2</autosave_period>
<autosave_path>C:/autosave</autosave_path>
</Configuration>
</SkyStudio>
Сериализация иерархии полиморфных объектов, в данном случае - коллекция
полиморфных объектов:
class Primitive
{
};
class PrimFloat : public Primitive
{
};
struct PrimitiveSerializer : public serialization::SerializeAbstract_T < Primitive >
{
PrimitiveSerializer()
{
RegisterType < PrimFloat > ( "float" );
RegisterType < PrimInt > ( "int" );
RegisterType < PrimBool > ( "bool" );
RegisterType < PrimVec2 > ( "vec2" );
RegisterType < PrimVec3 > ( "vec3" );
RegisterType < PrimVec4 > ( "vec4" );
RegisterType < PrimTexRect > ( "texrect" );
RegisterType < PrimColor > ( "color" );
RegisterType < PrimString > ( "string" );
RegisterType < PrimFileName > ( "filename" );
RegisterType < PrimLink > ( "link" );
RegisterType < PrimEnum > ( "enum" );
}
};
class AttributeStruct
{
...
struct Layout : public serialization::Layout_c < AttributeStruct >
{
Layout()
{
ContainerPtr( "primitives", &AttributeStruct::m_Primitives, serialization::Serializer < PrimitiveSerializer > () );
}
}
...
typedef std::list < Primitive * > Primitives_t;
Primitives_t m_Primitives;
}
в xml:
...
<primitives>
<_ type="float">
<name>yaw</name>
<min>-3.1415</min>
<max>3.1415</max>
</_>
<_ type="bool">
<name>open</name>
<default>true<default>
</_>
</primitives>
В общем, если честно то сейчас я бы не стал все это на C++ писать. И даже на C# бы не стал. Сейчас я бы DSL забабахал для описания и создания диаграмм классов и объектов. И компонентных диаграмм. Не только с целью реализации сериализации разумеется.
(Текст записи скрыт. Показать...)