示例#1
0
        private string EntityListSerializer(List <IEntity> entities, Encoding encoding, Formatting formatting, uint tabulationsCount)
        {
            string outerTabulationBuilder = string.Empty;
            string innerTabulationBuilder = string.Empty;

            if (formatting == Formatting.Indented)
            {
                SerializationTools.InitTabulations(out outerTabulationBuilder, out innerTabulationBuilder, tabulationsCount);
            }
            StringBuilder builder = new StringBuilder();

            builder.AppendLine("[");
            for (int i = 0; i < entities.Count; ++i)
            {
                if (entities[i] is File)
                {
                    builder.AppendLine($"{innerTabulationBuilder}(file:{i})={(formatting == Formatting.Indented ? File.SerializeToString(entities[i] as File, encoding, formatting, tabulationsCount + 1) : File.SerializeToString(entities[i] as File, encoding))}{(i == entities.Count - 1 ? ";" : ",")}");
                }
                else if (entities[i] is Directory)
                {
                    builder.AppendLine($"{innerTabulationBuilder}(directory:{i})={(formatting == Formatting.Indented ? Directory.SerializeToString(entities[i] as Directory, encoding, formatting, tabulationsCount + 1) : Directory.SerializeToString(entities[i] as Directory, encoding))}{(i == entities.Count - 1 ? ";" : ",")}");
                }
                else if (entities[i] is Hypermedia)
                {
                    var serializator = SerializationVersionTools.GetSerializationVersion((entities[i] as Hypermedia).Version);
                    builder.AppendLine($"{innerTabulationBuilder}(hypermedia:{i})={(formatting == Formatting.Indented ? serializator.SerializeToString(entities[i] as Hypermedia, formatting, tabulationsCount + 1) : serializator.SerializeToString(entities[i] as Hypermedia))}{(i == entities.Count - 1 ? ";" : ",")}");
                }
            }
            builder.Append($"{outerTabulationBuilder}]");
            return(builder.ToString());
        }
 /// <summary>
 ///   Serializes given hypermedia to stream asynchronously.
 /// </summary>
 /// <param name="outputStream">
 ///   The output stream in which hypermedia would be serialized.
 /// </param>
 /// <param name="instance">
 ///   The instance of hypermedia that would be serialized.
 /// </param>
 /// <param name="formatting">
 ///   <see cref="Formatting">Formatting</see> options for serialization.
 /// </param>
 /// <returns>
 ///   Task or void.
 /// </returns>
 public static async Task SerializeAsync(Stream outputStream, Hypermedia instance, Formatting formatting)
 {
     await Task.Run(async() =>
     {
         var serializator = SerializationVersionTools.GetSerializationVersion(instance.Version);
         var buffer       = Encoding.UTF8.GetBytes(serializator.SerializeToString(instance, formatting, 0));
         await outputStream.WriteAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
     }).ConfigureAwait(false);
 }
示例#3
0
        private List <IEntity> EntitiesListDeserializer(string input, Hypermedia parent, int count)
        {
            List <IEntity> entities = new List <IEntity>();

            DeserializationTools.CheckStringFormat(input, false);

            input = input.TrimStart('[').TrimEnd(']').TrimStart('\r').TrimEnd('\n').TrimStart('\n').TrimEnd('\r');
            var stringList = SplitEntitiesList(input, parent);

            if (stringList.Count != count)
            {
                throw new ArgumentException("Parsed string list does not match expected length", "count");
            }

            for (int i = 0; i < count; ++i)
            {
                string type  = new string(stringList[i].Skip(1).TakeWhile(s => s != ':').ToArray());
                int    index = int.Parse(new string(stringList[i].Skip(type.Length + 2).TakeWhile(s => s != ')').ToArray()));
                if (index != i)
                {
                    throw new ArgumentException("Possible serialization error encountered. Unexpected sequence", "input");
                }
                switch (type)
                {
                case "file":
                    entities.Add(File.DeserializeFromString(new string(stringList[i].SkipWhile(s => s != '[').ToArray()), parent, parent.Encoding));
                    break;

                case "directory":
                    entities.Add(Directory.DeserializeFromString(new string(stringList[i].SkipWhile(s => s != '[').ToArray()), parent, parent.Encoding));
                    break;

                case "hypermedia":
                    var deserializer = SerializationVersionTools.GetSerializationVersion(SerializationVersionTools.GetVersion(new string(stringList[i].SkipWhile(s => s != '[').ToArray())));
                    entities.Add(deserializer.DeserializeFromString(new string(stringList[i].SkipWhile(s => s != '[').ToArray()), parent));
                    break;

                default:
                    throw new ArgumentException("Possible serialization error encountered. Unexpected type", "input");
                }
            }

            if (count != entities.Count)
            {
                throw new ArgumentException("Serialized and deserialized collection length does not match", "count");
            }

            return(entities);
        }
 /// <summary>
 ///   Deserializes given stream to hypermedia asynchronously.
 /// </summary>
 /// <param name="inputStream">
 ///   The input stream from which hypermedia would be deserialized.
 /// </param>
 /// <returns>
 ///   Task with Hypermedia.
 /// </returns>
 public static async Task <Hypermedia> DeserializeAsync(Stream inputStream)
 {
     return(await Task <Hypermedia> .Run(() =>
     {
         List <byte> buffer = new List <byte>();
         bool isEndOfStream = false;
         while (!isEndOfStream)
         {
             int b = inputStream.ReadByte();
             if (b != -1)
             {
                 buffer.Add((byte)b);
             }
             else
             {
                 isEndOfStream = true;
             }
         }
         string input = System.Text.Encoding.UTF8.GetString(buffer.ToArray());
         var deserializer = SerializationVersionTools.GetSerializationVersion(SerializationVersionTools.GetVersion(input));
         return deserializer.DeserializeFromString(input);
     }).ConfigureAwait(false));
 }
示例#5
0
        private bool TrySplitEntitiesList(string input, Hypermedia parent, out List <string> entities)
        {
            entities = new List <string>();

            string tmpInput = input;

            tmpInput += "\r\n";
            bool isProcessed = false;

            while (!isProcessed)
            {
                bool   isStringValid = false;
                string toReturn      = string.Empty;

                string type = new string(tmpInput.Skip(1).TakeWhile(s => s != ':').ToArray());
                switch (type)
                {
                case "file":
                    toReturn = new string(tmpInput.SkipWhile(s => s != '[').Take(1).ToArray());
                    do
                    {
                        isStringValid = File.IsSerializedStringValid(toReturn, parent);
                        if ((new string(tmpInput.TakeWhile(s => s != '[').ToArray()) + toReturn).Length == tmpInput.Length)
                        {
                            return(false);
                        }
                        if (!isStringValid)
                        {
                            toReturn += new string(tmpInput.Skip(new string(tmpInput.TakeWhile(s => s != '[').ToArray()).Length + toReturn.Length).Take(1).ToArray());
                        }
                    }while (!isStringValid);
                    break;

                case "directory":
                    toReturn = new string(tmpInput.SkipWhile(s => s != '[').Take(1).ToArray());
                    do
                    {
                        isStringValid = Directory.IsSerializedStringValid(toReturn, parent);
                        if ((new string(tmpInput.TakeWhile(s => s != '[').ToArray()) + toReturn).Length == tmpInput.Length)
                        {
                            return(false);
                        }
                        if (!isStringValid)
                        {
                            toReturn += new string(tmpInput.Skip(new string(tmpInput.TakeWhile(s => s != '[').ToArray()).Length + toReturn.Length).Take(1).ToArray());
                        }
                    }while (!isStringValid);
                    break;

                case "hypermedia":
                    toReturn = new string(tmpInput.SkipWhile(s => s != '[').Take(1).ToArray());
                    do
                    {
                        var versions = SerializationVersionTools.GetVersions();
                        foreach (var v in versions)
                        {
                            isStringValid = v.IsSerializedStringValid(toReturn, parent);
                            if (isStringValid)
                            {
                                break;
                            }
                        }

                        if ((new string(tmpInput.TakeWhile(s => s != '[').ToArray()) + toReturn).Length == tmpInput.Length)
                        {
                            return(false);
                        }
                        if (!isStringValid)
                        {
                            toReturn += new string(tmpInput.Skip(new string(tmpInput.TakeWhile(s => s != '[').ToArray()).Length + toReturn.Length).Take(1).ToArray());
                        }
                    }while (!isStringValid);
                    break;

                default:
                    return(false);
                }
                string entity = new string(tmpInput.TakeWhile(s => s != '[').ToArray()) + toReturn;
                entities.Add(entity);
                int il = tmpInput.Length;
                tmpInput = tmpInput.Remove(0, entity.Length + 3);
                if (tmpInput == string.Empty)
                {
                    isProcessed = true;
                }
            }
            if (entities.Count <= 0)
            {
                return(false);
            }
            return(true);
        }
示例#6
0
        private bool TryEntitiesListDeserializer(string input, Hypermedia parent, int count)
        {
            List <IEntity> entities = new List <IEntity>();

            if (!DeserializationTools.CheckStringFormat(input, true))
            {
                return(false);
            }

            input = input.TrimStart('[').TrimEnd(']').TrimStart('\r').TrimEnd('\n').TrimStart('\n').TrimEnd('\r');
            List <string> stringList      = new List <string>();
            bool          isEntitiesValid = TrySplitEntitiesList(input, parent, out stringList);

            if (!isEntitiesValid)
            {
                return(false);
            }
            if (stringList.Count != count)
            {
                return(false);
            }

            bool result = true;

            for (int i = 0; i < count; ++i)
            {
                string type  = new string(stringList[i].Skip(1).TakeWhile(s => s != ':').ToArray());
                int    index = int.Parse(new string(stringList[i].Skip(type.Length + 2).TakeWhile(s => s != ')').ToArray()));
                if (index != i)
                {
                    return(false);
                }
                switch (type)
                {
                case "file":
                    if (!File.IsSerializedStringValid(new string(stringList[i].SkipWhile(s => s != '[').ToArray()), parent))
                    {
                        result = false;
                    }
                    break;

                case "directory":
                    if (!Directory.IsSerializedStringValid(new string(stringList[i].SkipWhile(s => s != '[').ToArray()), parent))
                    {
                        result = false;
                    }
                    break;

                case "hypermedia":
                    var deserializer = SerializationVersionTools.GetSerializationVersion(SerializationVersionTools.GetVersion(new string(stringList[i].SkipWhile(s => s != '[').ToArray())));
                    if (!deserializer.IsSerializedStringValid(new string(stringList[i].SkipWhile(s => s != '[').ToArray()), parent))
                    {
                        result = false;
                    }
                    break;

                default:
                    return(false);
                }
            }

            return(result);
        }
示例#7
0
        private List <string> SplitEntitiesList(string input, Hypermedia parent)
        {
            List <string> entities = new List <string>();

            string tmpInput = input;

            tmpInput += "\r\n";
            bool isProcessed = false;

            while (!isProcessed)
            {
                bool   isStringValid = false;
                string toReturn      = string.Empty;

                string type = new string(tmpInput.Skip(1).TakeWhile(s => s != ':').ToArray());
                switch (type)
                {
                case "file":
                    toReturn = new string(tmpInput.SkipWhile(s => s != '[').Take(1).ToArray());
                    do
                    {
                        isStringValid = File.IsSerializedStringValid(toReturn, parent);
                        string tmpEntity = new string(tmpInput.TakeWhile(s => s != '[').ToArray()) + toReturn;
                        if (tmpEntity.Length == tmpInput.Length)
                        {
                            throw new ArgumentException("Possible serialization error encountered. Unexpected input.", "input");
                        }
                        if (!isStringValid)
                        {
                            toReturn += new string(tmpInput.Skip(new string(tmpInput.TakeWhile(s => s != '[').ToArray()).Length + toReturn.Length).Take(1).ToArray());
                        }
                    }while (!isStringValid);
                    break;

                case "directory":
                    toReturn = new string(tmpInput.SkipWhile(s => s != '[').Take(1).ToArray());
                    do
                    {
                        isStringValid = Directory.IsSerializedStringValid(toReturn, parent);
                        string tmpEntity = new string(tmpInput.TakeWhile(s => s != '[').ToArray()) + toReturn;
                        if (tmpEntity.Length == tmpInput.Length)
                        {
                            throw new ArgumentException("Possible serialization error encountered. Unexpected input.", "input");
                        }
                        if (!isStringValid)
                        {
                            toReturn += new string(tmpInput.Skip(new string(tmpInput.TakeWhile(s => s != '[').ToArray()).Length + toReturn.Length).Take(1).ToArray());
                        }
                    }while (!isStringValid);
                    break;

                case "hypermedia":
                    toReturn = new string(tmpInput.SkipWhile(s => s != '[').Take(1).ToArray());
                    do
                    {
                        var versions = SerializationVersionTools.GetVersions();
                        foreach (var v in versions)
                        {
                            isStringValid = v.IsSerializedStringValid(toReturn, parent);
                            if (isStringValid)
                            {
                                break;
                            }
                        }

                        string tmpEntity = new string(tmpInput.TakeWhile(s => s != '[').ToArray()) + toReturn;
                        if (tmpEntity.Length == tmpInput.Length)
                        {
                            throw new ArgumentException("Possible serialization error encountered. Unexpected input.", "input");
                        }
                        if (!isStringValid)
                        {
                            toReturn += new string(tmpInput.Skip(new string(tmpInput.TakeWhile(s => s != '[').ToArray()).Length + toReturn.Length).Take(1).ToArray());
                        }
                    }while (!isStringValid);
                    break;

                default:
                    throw new ArgumentException("Possible serialization error encountered. Unexpected type", "input");
                }
                string entity = new string(tmpInput.TakeWhile(s => s != '[').ToArray()) + toReturn;
                entities.Add(entity);
                tmpInput = tmpInput.Remove(0, entity.Length + 3);
                if (tmpInput == string.Empty)
                {
                    isProcessed = true;
                }
            }
            return(entities);
        }