static string ConvertBackToGenericArgsString(string Tags)
        {
            if (TagToGenericArgsCache.TryGetValue(Tags, out var CachedResult))
            {
                return(CachedResult);
            }

            var Args = Tags.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

            var Result = new StringBuilder();

            bool First = true;

            foreach (var Arg in Args)
            {
                if (First)
                {
                    First = false;
                }
                else
                {
                    Result.Append(',');
                }

                Result.Append('[');
                var Type = BondSerializationUtil.ParseTypeIdentifierString(Arg);
                Result.Append(Type.AssemblyQualifiedName);
                Result.Append(']');
            }

            TagToGenericArgsCache.TryAdd(Tags, Result.ToString());
            GenericArgsToTagCache.TryAdd(Result.ToString(), Tags);

            return(Result.ToString());
        }
        public static IGenericSerializable FromByteArray(ArraySegment <byte> Data)
        {
            if (Data.Count == 0)
            {
                return(null);
            }

            var Ref  = (SerializationGenericReference)BondSerializer.Deserialize(typeof(SerializationGenericReference), new ArraySegmentReaderStream(Data));
            var Type = BondSerializationUtil.ParseTypeIdentifierString(Ref.Type);

            return((IGenericSerializable)BondSerializer.Deserialize(Type, new MemoryStream(Ref.Data.ToArray())));
        }