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. 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.