Changes in version 1.8.0                        

    o   Added createDedupSession(), addObjectToDedupSession() and
	checkObjectInDedupSession() utilities, that allow saveObject()
	method developers to check for duplicated objects and avoid
	re-saving them. Most of this functionality was migrated and
	generalized from the alabaster.matrix package.

    o   Added the cloneDirectory() function to easily clone the
	contents of an existing directory, either by copying or linking
	to the files. This should be used for creating lightweight
	on-disk representations of duplicated objects.

    o   Added the absolutizePath() function to obtain an absolute file
	path. This is occasionally necessary to ensure that references
	to deduplicated resources are robust to changes to the working
	directory.

    o   Coerce numeric_version instances to strings or character
	vectors before saving them in saveObject(). This includ such
	objects encountered inside lists or DataFrames.

    o   Added getSaveEnvironment() and related functions to keep track
	of the R environment used to save each object. This facilitates
	debugging and enables corrective actions to be taken by loading
	functions when encountering files created by buggy versions of
	any package in the alabaster stack.

    o   Added preliminary support for custom variable length string
	(VLS) arrays, which compress the heap for more efficient
	storage than HDF5's VLS implementation. This is enabled in the
	saveObject() methods for standalone character vectors as well
	as character vectors in DataFrames and lists via the relevant
	character.vls= option. Setting character.vls=NULL will
	automatically switch between fixed-length string datasets and
	VLS arrays based on the estimated storage. (Defaults to FALSE
	for back-compatibility.)

                        Changes in version 1.6.0                        

    o   Distinguish between scalars and length-1 vectors when
	saving/loading lists. This effectively unboxes all length-1
	vectors in a list, by default; this is probably the more
	reasonable expectation for other languages that have a concept
	of scalars. Users can override this by calling I() on elements
	that they want to keep as length-1 vectors, in the same manner
	as jsonlite.

    o   Streamlined the definition of the Rfc3339 class so that it
	behaves better with I().

    o   Normalize paths to resolve ~ prior to calling C++ code.

    o   Open HDF5 files in read-only mode to avoid permission-related
	problems for readObject()-dispatched functions.

    o   Store numbers at maximum precision when saving lists in the
	JSON format via saveObject().

    o   Added registerValidateObjectSatisfiesInterface() and
	registerValidateObjectDerivedFrom(), to allow developers to
	declare that custom subclasses satisfy an interface or have an
	inheritance relationship, respectively.

    o   Updated validateDirectory() so that it works with a directory
	of objects saved via saveObject(). Objects saved under the old
	regime (i.e., stageObject()) are auto-detected but can also be
	explicitly validated by setting legacy=FALSE.

    o   Added a data.frame method for saveObject(), to avoid fallback
	to the list method.

                        Changes in version 1.4.0                        

    o   Added the saveObject and readObject functions, which comply
	with the newly formalized takane specifications for each
	object's on-disk representation. This enables greater
	consistency across language frameworks (e.g., Python) by using
	a common library for enforcing the specification.  It also
	eliminates the need for a separate metadata file, simplifying
	the user experience and the expectations on extension
	developers.

    o   Added a dedicated validateObject function, which uses the
	takane libary to validate each object's files. This allows
	users to easily check if a set of files is compliant with the
	specification, e.g., when modifying parts of the object outside
	of saveObject.

    o   Soft-deprecation of the stageObject and loadObject functions.
	These use legacy representations that do not comply with the
	tightened takane specifications.