{A}快速使用指南
使用STL序列化库(STL - SL的)是一个过程分为三个步骤。第一步,你声明你要序列化使用STL - SL的STL的类型。value_trait < int > int_filer;
value_trait < std::list< bool > > bool_list_filer;
value_trait < std::map<std::string, std::multimap< float, bool > > > complex_stl_filer;
在代码段,三个不同类型的声明。每种类型都有不同程度的复杂性。 int_filer是所有最简单的,其中一个int参数的value_trait模板类。 int_filer因此,可以使用序列化和负载从序列化文件的INT。
同样,bool_list_filer声明准备序列化BOOL类型的列表。而complex_stl_filer准备的字符串和multimap数据类型multimap中持有浮动,BOOL对如上所示的地图。
在接下来的步骤,创建一个file_interface需要一个序列化的文件名序列化的数据将被写入或读从的。{C}
注意,file_interface并不需要在声明的类型,这意味着不同类型的STL对象,可在相同的序列化文件的序列化。
此外,因为序列化文件的接口声明是不相关的数据文件的声明,上述两个步骤可能需要对方的地方。
在第三和最后阶段,数据序列化到文件或从它装载。filer.serialize ( stl_object, file_interface );
filer.load ( stl_object, file_interface );
下面的代码片断演示了使用上面描述的所有三个步骤:
STL序列化库//declare serialization-file interfaces
stl_trait_writer file_interface ( ".\\serialization-file.txt");
//declare the STL object
std::vector < int > stl_object;
//declare the data filer
value_trait < std::vector < int > > data_filer;
//...populate data in stl_object...//
//serialize data in stl_object in the file pointed by file_interface
data_filer.serialize ( stl_object, file_interface );
//-- or --//
//load data in the file pointed by file_interface in stl_object STL object
data_filer.load ( stl_object, file_interface );
//...use data in stl_object...//
本文介绍了模板类的序列化用户定义的文件格式(默认情况下,文本文件)的STL对象。
STL序列化库是由两个主要部分:序列化Filer和序列化模板类组成。序列化的文件管理器
这包括以下三类://Serialization-file writer class.
//This guy writes the data to the file specified by 'file_path'.
//NOTE: This class does not recognize the data objects containing spaces, tabs,
// new-line characters in them. This may be fixed by overloading '<<' operator and
// adding escape-sequencing logic in it.
class stl_trait_writer: public std::ofstream
{
public:
stl_trait_writer(const std::string& file_path):std::ofstream(file_path.c_str())
{}
};
//Serialization-file reader class.
//This guy reads the data from the file specified by 'file_path'.
//NOTE: This class does not recognize the data objects containing spaces, tabs,
// new-line characters in them. This may be fixed by overloading '>>' operator and
// adding escape-sequencing logic in it.
class file_trait_reader: public std::ifstream
{
public:
file_trait_reader(const std::string& file_path):std::ifstream(file_path.c_str())
{}
};
//Serialization filer class.
//This guy presents the set of reader, writer objects responsible for reading and
// writing to the serialization file.
template <class writer_trait , class reader_trait>
class filer_trait
{
public:
typedef typename writer_trait writer_type;
typedef typename reader_trait reader_type;
};
stl_trait_writer和file_trait_reader类提供了基本的文件I / O机制。 filer_trait类是一个文件管理器,只有对上述两种类类型。另一种方法可能filer_trait类实现文件的I / O的可扩展性的成本的简单机制。
文件作家类(stl_trait_writer)可能与用户级改变的序列化文件格式,例如XML取代。加载文件(file_trait_writer)序列化数据提供一个文件阅读器类,一类能够了解用户的文件格式将不得不改变。序列化的模板类
在本模块中的类,包括打破复杂的STL类型分为基本类型和序列化/反序列化的基本数据类型的语言机制。//Basic datatype serializer class.
//Triggers the read or write to the serialization file for the basic datatypes.
//NOTE: This class has been tweaked to work with the 'stl_trait_writer' class.
template <class val_trait, class val_filer_trait =
filer_trait<stl_trait_writer, file_trait_reader> >
class value_trait
{
public:
typedef typename val_filer_trait::writer_type writer_trait;
typedef typename val_filer_trait::reader_type reader_trait;
void serialize(const val_trait& val, writer_trait &pen)
{
pen << val << "\n"; //a tweak for 'stl_trait_writer' class defined above.
//pen << val; //correct code, this should replace above line of code should
//you choose to implement your own 'stl_trait_writer' class.
pen.flush();
}
void load(val_trait& val, reader_trait &pen)
{
pen >> val;
}
};
value_trait类是负责序列化和加载基本数据类型。上面的代码调整,与上一节中所描述的序列化文件管理器类。
下面的摘录说明分解成其原始成分下降复杂的STL类型的代码。//Sequence-list datatype serializer class.
//Triggers the read or write to the serialization file for the Sequence-list datatypes.
//This class takes care of STL types -- list, vector, stack, queue, deque
// and priority_queue
//NOTE: 'basic_string' type is not treated as sequence-list, but as basic type.
template <class sequence_list_type, class val_filer_trait >
class sequence_list_value_trait
{
public:
typedef typename val_filer_trait::writer_type writer_trait;
typedef typename val_filer_trait::reader_type reader_trait;
typedef typename sequence_list_type::size_type size_type;
typedef typename sequence_list_type::value_type value_type;
void serialize (sequence_list_type& val, writer_trait &pen )
{
value_trait<size_type, val_filer_trait> size_filer;
size_filer.serialize (val.size(), pen);
for(sequence_list_type::iterator i=val.begin(); i != val.end(); i++)
{
value_trait<value_type, val_filer_trait> val_trait_key_filer;
val_trait_key_filer.serialize(*i,pen);
}
}
void load (sequence_list_type& val, reader_trait &pen )
{
value_trait<size_type, val_filer_trait> size_reader;
size_type val_size=0;
size_reader.load(val_size, pen);
for(; val_size > 0; val_size--)
{
value_type element;
value_trait<value_type, val_filer_trait> val_trait_key_reader;
val_trait_key_reader.load(element, pen);
val.push_back(element);
}
}
};
sequence_list_value_trait类分解列表,向量,栈,队列,双端队列,和priority_queue STL类型更细小的组件类型。因此,一个int类型的载体,将被分解成一个int类型的默认向量的迭代序列的列表::iterator类型。和int类型的值序列化的value_trait类。//Triggers the read or write to the serialization file for the Associative-list
// datatypes.
//This class takes care of STL types -- map, multimap, set, multiset
template <class associative_list_type, class val_filer_trait >
class associative_list_value_trait
{
public:
typedef typename val_filer_trait::writer_type writer_trait;
typedef typename val_filer_trait::reader_type reader_trait;
typedef typename associative_list_type::size_type size_type;
typedef typename associative_list_type::key_type key_type;
typedef typename associative_list_type::mapped_type data_type;
void serialize (associative_list_type& val, writer_trait &pen )
{
value_trait<size_type, val_filer_trait> size_filer;
size_filer.serialize (val.size(), pen);
for(associative_list_type::iterator i=val.begin(); i != val.end(); i++)
{
value_trait<key_type, val_filer_trait> val_trait_key_filer;
value_trait<data_type, val_filer_trait> val_trait_data_filer;
val_trait_key_filer.serialize(i->first,pen);
val_trait_data_filer.serialize(i->second,pen);
}
}
void load (associative_list_type& val, reader_trait &pen )
{
value_trait<size_type, val_filer_trait> size_reader;
size_type val_size=0;
size_reader.load(val_size, pen);
for(; val_size > 0; val_size--)
{
key_type key_element;
value_trait<key_type, val_filer_trait> val_trait_key_reader;
val_trait_key_reader.load(key_element, pen);
data_type data_element;
value_trait<data_type, val_filer_trait> val_trait_data_reader;
val_trait_data_reader.load(data_element, pen);
val.insert (std::pair<key_type, data_type> (key_element, data_element));
}
}
};
associative_list_value_trait类是一个复杂的版本,在地图上,multimap中,设置和multiset的STL类型分解到他们的关键数据元素类型和进一步细分根据需要,或序列化的sequence_list_value_trait类。
以下提取描绘了一个复杂的STL类型的启动故障的过程中,使用支付上述associative_list_value_trait和sequence_list_value_trait类的机制。//STL vector datatype serializer class.
//Triggers the read or write to the serialization file for the STL vector datatype.
template <class val_trait_key, class val_trait_data, class val_filer_trait >
class value_trait< std::vector<val_trait_key, val_trait_data> , val_filer_trait >
{
public:
typedef typename val_filer_trait::writer_type writer_trait;
typedef typename val_filer_trait::reader_type reader_trait;
typedef std::vector<val_trait_key, val_trait_data> vector_value_trait;
void serialize (vector_value_trait& val, writer_trait &pen )
{
sequence_list_value_trait<vector_value_trait,
val_filer_trait> sequence_list_value_filer;
sequence_list_value_filer.serialize (val, pen);
}
void load (vector_value_trait& val, reader_trait &pen )
{
sequence_list_value_trait<vector_value_trait,
val_filer_trait> sequence_list_value_reader;
sequence_list_value_reader.load (val, pen);
}
};
上面的代码段初始化向量STL类型解散进一步序列化的颗粒组成部分。类似的逻辑实现列表,栈,队列,双端队列,和priority_queue STL类型。//STL multimap datatype serializer class.
//Triggers the read or write to the serialization file for the STL multimap datatype .
template <class val_trait_key, class val_trait_data, class val_filer_trait >
class value_trait< std::multimap<val_trait_key, val_trait_data> , val_filer_trait >
{
public:
typedef typename val_filer_trait::writer_type writer_trait;
typedef typename val_filer_trait::reader_type reader_trait;
typedef std::multimap<val_trait_key, val_trait_data> multimap_value_trait;
void serialize (multimap_value_trait& val, writer_trait &pen )
{
associative_list_value_trait<multimap_value_trait,
val_filer_trait> associative_list_value_filer;
associative_list_value_filer.serialize (val, pen);
}
void load (multimap_value_trait& val, reader_trait &pen )
{
associative_list_value_trait<multimap_value_trait,
val_filer_trait> associative_list_value_reader;
associative_list_value_reader.load (val, pen);
}
};
处理碎片更细的组件向量类型的像上面摘录,这段代码一个multimap中溶解到其键类型和数据类型为进一步序列化组件。类似的逻辑可能是其他关联容器,如地图,设置和multiset的实施。评论
应该指出的是,上述库STL中的文件管理器声明的类创建一个每分型。虽然这个剂量没有考虑任何额外的运行时间超过头,命名空间中的序列化的类的数量增加一倍。如果类数超过你的编译器的支持,您可能要重新因素的类层次结构。
以上的事实可能会被视为处于劣势,但应该指出的是,类计数,不施加任何在运行时的开销。它的优点是,STL - SL的代码是类型安全的。
这里介绍的STL - SL的是第一次修订,你可能要包括正在序列化序列化文件中关于STL类型的类型信息,从而帮助在STL - SL的运行时类型检查。
如的其他图书馆提供的是更强大,但可以说不一定直观。这些库解决了许多其他问题,如类版本,指针恢复和数据的可移植性。这篇文章的目的不是取代它们;本条应作为一个轻量级的,易于使用的替代品。此外,这里介绍的代码可以被视为一个STL序列化引擎,甚至,更全面地实施一个序列化库。