/// <summary>
        ///   Deserializes passed string to file.
        /// </summary>
        /// <param name="input">
        ///   String to be deserialized.
        /// </param>
        /// <param name="parent">
        ///   Parent <see cref="IEntity">entity</see> for file.
        /// </param>
        /// <param name="encoding">
        ///   Encoding used for deserialization of file name.
        ///   Usually passed from parent <see cref="Hypermedia">hypermedia</see> where file resides during deserialization of parent hypermedia.
        /// </param>
        public static File DeserializeFromString(string input, IEntity parent, Encoding encoding)
        {
            string         path                 = null;
            string         name                 = null;
            string         extension            = null;
            FileAttributes?attributes           = null;
            long           lastModDateTime      = 0;
            DateTime?      lastModifiedDateTime = null;
            List <Block>   blocks               = new List <Block>();
            bool           isSingleBlock        = false;
            ulong          size                 = 0;
            string         parent_path          = null;
            string         hash                 = null;

            DeserializationTools.CheckStringFormat(input, false);

            string        blockList;
            int           count;
            List <string> stringList;

            DeserializationTools.SplitStringForSystemEntity(input, _startOfBlockListDeclaration, _endOfBlockListDeclaration, 13, out count, out blockList, out stringList, true);

            DeserializationTools.ParseStartBaseSystemEntitySerializationString(stringList, encoding, out path, out name);
            extension            = new string(stringList[2].Skip(19).TakeWhile(x => x != ',').ToArray());
            attributes           = FileAttributesDeserializer(new string(stringList[3].Skip(34).TakeWhile(x => x != ',').ToArray()));
            lastModDateTime      = long.Parse(new string(stringList[4].Skip(41).TakeWhile(x => x != ',').ToArray()));
            lastModifiedDateTime = DateTimeOffset.FromUnixTimeSeconds(lastModDateTime).UtcDateTime;
            isSingleBlock        = (new string(stringList[5].Skip(26).TakeWhile(x => x != ',').ToArray()) == "true") ? true : false;
            DeserializationTools.ParseEndBaseSerializationString(stringList, 6, out size, out parent_path, out hash);

            DeserializationTools.CheckParent(parent, parent_path, false);

            File file = new File
            {
                Path                 = path,
                Name                 = name,
                Extension            = extension,
                Attributes           = attributes,
                LastModifiedDateTime = lastModifiedDateTime,
                IsSingleBlock        = isSingleBlock,
                Size                 = size,
                Parent               = parent,
                Hash                 = hash
            };

            if (count != 0)
            {
                blocks = BlocksListDeserializer(blockList, file, count);
            }

            file.Blocks = blocks;
            return(file);
        }
        /// <summary>
        ///   Deserializes passed string to directory.
        /// </summary>
        /// <param name="input">
        ///   String to be deserialized.
        /// </param>
        /// <param name="parent">
        ///   Parent <see cref="IEntity">entity</see> for directory.
        /// </param>
        /// <param name="encoding">
        ///   Encoding used for deserialization of directory name.
        ///   Usually passed from parent <see cref="Hypermedia">hypermedia</see> where directory resides during deserialization of parent hypermedia.
        /// </param>
        public static Directory DeserializeFromString(string input, IEntity parent, Encoding encoding)
        {
            string               path                 = null;
            string               name                 = null;
            FileAttributes?      attributes           = null;
            long                 lastModDateTime      = 0;
            DateTime?            lastModifiedDateTime = null;
            List <ISystemEntity> entities             = new List <ISystemEntity>();
            ulong                size                 = 0;
            string               parent_path          = null;
            string               hash                 = null;

            DeserializationTools.CheckStringFormat(input, false);

            string        entitiesList;
            int           count;
            List <string> stringList;

            DeserializationTools.SplitStringForSystemEntity(input, _startOfSystemEntityListDeclaration, _endOfSystemEntityListDeclaration, 31, out count, out entitiesList, out stringList, false);

            DeserializationTools.ParseStartBaseSystemEntitySerializationString(stringList, encoding, out path, out name);
            attributes           = FileAttributesDeserializer(new string(stringList[2].Skip(34).TakeWhile(x => x != ',').ToArray()));
            lastModDateTime      = long.Parse(new string(stringList[3].Skip(41).TakeWhile(x => x != ',').ToArray()));
            lastModifiedDateTime = DateTimeOffset.FromUnixTimeSeconds(lastModDateTime).UtcDateTime;
            DeserializationTools.ParseEndBaseSerializationString(stringList, 4, out size, out parent_path, out hash);

            DeserializationTools.CheckParent(parent, parent_path, false);

            Directory directory = new Directory
            {
                Path                 = path,
                Name                 = name,
                Attributes           = attributes,
                LastModifiedDateTime = lastModifiedDateTime,
                Size                 = size,
                Parent               = parent,
                Hash                 = hash
            };

            if (count != 0)
            {
                entities = SystemEntitiesListDeserializer(entitiesList, directory, count, encoding);
            }

            directory.Entities = entities;
            return(directory);
        }