/**
     * Reads the data from a string.
     */

    public static TransformationJob Read(string _s, bool fromHash = false)
    {
        Match jobExists = TransformationQueue.queueEntryParse.Match(_s);

        if (!jobExists.Success)
        {
            throw new Exception("Could not read job string " + _s);
        }

        string timeString = jobExists.Groups[1].ToString();
        string dataString = jobExists.Groups[2].ToString();
        string boolString = jobExists.Groups[3].ToString();

        ulong transformTime;

        if (!StringParsers.TryParseUInt64(timeString, out transformTime))
        {
            throw new Exception("Could not parse time string " + timeString);
        }

        bool inProgress;

        if (!StringParsers.TryParseBool(boolString, out inProgress))
        {
            throw new Exception("Could not parse in progress string " + boolString);
        }

        TransformationData tData = TransformationData.Read(dataString, fromHash);

        return(new TransformationJob(transformTime, tData, inProgress));
    }