s11n.net
Taking the pain out of serialization.
Project powered by:
SourceForge.net

Terms & Definitions

Below is a list of core terms used in libs11n. The bolded words within the definitions highlight other important terms defined in this list, or denote particularly significant data types. This bolding is intended to help reinforce understanding of the relationships between the various elements of the s11n library.

  • Data Node - a generic term for map-like types which store arbitrary key/value properties and child nodes, plus some meta-data (like type information for the stored data, if needed). They are structured in a tree-like fashion, DOM-style. In s11nlite this role is played by the s11n::data_node type, though core s11n supports any types which conform to the conventions laid out by that type. (The core doesn't actually know that type exists.)
  • serializable (with a small ''s'')- the property of being able to be save and restore state, e.g., to allow persistent object states across application sessions, network connections, etc.
  • Serializable Type or Serializable (with a big ''S'') - any type for which s11n recognizes a Serializable Interface, either implemented directly by a Serializable type or via a Serialization Proxy. Serializables store their data in Data Nodes during serialization and load their data from data nodes during deserialization.
  • Serializable Proxy or Serialization Proxy - a functor (possibly two) which registers with s11n as being the handler for de/serialization of a given type. By extension, the proxied type is said to be Serializable. All de/serialize operations s11n performs on behalf of that type are delegated to the proxy type. This allows, amongst other things, transparent serialization of 3rd-party classes and class templates.
    Proxies are not technically Serializables - they are, more properly, the implementation for a Serializable's serialization operators. (Got that?)
  • serialization, to serialize - several meanings:

    • To save the state of a Serializable into a Data Node.
    • To save a Data Node to a data stream. This emits it to a Serializer-specific grammar.
    • Several other subtle, context-specific meanings.
  • deserialization, to deserialize - the converse of serialize:

    • To restore the state of a Serializable, presumably using data from a Data Node.
    • To load a Data Node from an input stream.
  • de/serialization or de/serialize - shorthand forms of ''deserialization and serialization'' and ''deserialize and serialize.''
  • Serializer - a type responsible for converting data nodes to and from a specific grammar. For example, some Serializers use a XML dialect, while others use custom formats. Theoretically, any data which can be structured in a DOM-like fashion (even if only via logical transformation) can be handled by Serializers. In s11n Serializers are also always Deserializers (at least logically, in terms of the interface), with the one minor exception that Serializable Proxies may be implemented in terms of two separate functors.
  • serialization operators, de/serialize(), or Serializable Interface - a generic name for the pair of de/serialize functions which Serializables and Serializable Proxies have, regardless of the actual names or argument types of the functions. Sometimes also used to refer to the de/serialize functions within other interfaces, such as the s11n core.
  • de/serialization operations - a generic term encompassing functions which trigger a chain of events which lead through the s11n de/serialization core (and, presumably, back). In plain English: s11n::de/serialize<>(), and related functions, fall into this category.
  • Default Serializable Interface - Serializables which implement both of their serialization operators as operator() are said to follow the Default Serializable Interface. Types which do this do not need to tell s11n what their serialization interface looks like - it will pick them up automatically.
  • Load/Save vs De/Serialize - By s11n convention, the words "save" and "load" are used when dealing with streams or files, and "serialize" and "deserialize" are used when dealing with saving or restoring the state of a Serializable to or from a Data Node. Sometimes the words are used interchangeably and, while it is technically correct in many cases, such usage is considered ''marginally ambiguous'' in s11n.
  • Classloader - an object used to search for classes based on a lookup key. In s11n this lookup key is conventionally the string form of a class' name. Classloaders are used during deserialization to load the proper type for a given node (this is necessary in order to support polymorphic deserialization). The s11n classloader has support for loading classes from DLLs, but that feature is not covered much in these docs. Classloaders work primarily not off of specific ''concrete'' types, but off of Base Types, as described briefly below. See http://s11n.net/class_loader/ for more detail than you probably want to know about these.
  • T's classloader, or the T classloader - Refers the the classloader which uses type T as it's point of reference for registering and loading classes. More specifically, it means cl::class_loader<T>, a classloader which supports loading T types. Subtypes of T should be registered with T's classloader, regardless of whether or not they also register with their own classloader (e.g., class_loader<SomeTSubType>).
  • Base Type - in s11n, especially in the context of a classloader, this is used to mean the base-most type which a given classloader ''knows about.'' This type is used for registering subtypes of Base Types with the Base Type's Serializable Interface, and is critical for classloading purposes. It is covered in massive detail in the classloader's library manual. In a broader sense, Base Types are used as contexts for marshaling the s11n and client-side Serializable Interfaces into internally-compatible forms. Base Types are often used as contexts, in the form of template parameters for functions and classes for which this Base Type distinction is significant (e.g., those dealing with de/serialization and classloading).
  • Streamable [types] - In the context of s11n this means any type for which istream>> and ostream<< operators can be applied to successfully save/restore the state of an object of that type. This inherently includes all PODs, std::string, and any client-supplied types which meet these conditions. This also implicitely excludes all pointer types. Note that Serializables are not implicitely Streamable, as s11n does not actually deal with streams at it's core.
Did you get all that?

Using the library is not as complex as the above list may imply, as the rest of this documentation will attempt to convince you. Yes, the details of serialization and classloading, especially in a lower-level language like C++, are downright scary. s11n tries to move the client as far away as possible from those scary details, and it goes to great pains to do so. However, some understanding of the above terms, and their inter-relationships, is critical to making full use of s11n.

For those interested in reading more about serialization in C++, including some if it's pitfalls, i highly recommend Marshall Kline's FAQ on the topic.