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.