public static XunitSerializationTriple DeserializeTriple(string value)
        {
            var pieces = value.Split(new[] { ':' }, 3);

            if (pieces.Length < 2)
            {
                throw new ArgumentException("Data does not appear to be a valid serialized triple: " + value);
            }

            var pieceType         = SerializationHelper.GetType(pieces[1]);
            var deserializedValue = pieces.Length == 3 ? Deserialize(pieceType, pieces[2]) : null;

            return(new XunitSerializationTriple(pieces[0], deserializedValue, pieceType));
        }
            public void Deserialize(IXunitSerializationInfo info)
            {
                var arrType     = SerializationHelper.GetType(info.GetValue <string>("ElementType"));
                var rank        = info.GetValue <int>("Rank");
                var totalLength = info.GetValue <int>("TotalLength");

                int[] lengths     = new int[rank];
                int[] lowerBounds = new int[rank];
                for (int i = 0; i < lengths.Length; i++)
                {
                    lengths[i]     = info.GetValue <int>("Length" + i);
                    lowerBounds[i] = info.GetValue <int>("LowerBound" + i);
                }

                array = Array.CreateInstance(arrType, lengths, lowerBounds);

                int[] indices = new int[rank];
                for (int i = 0; i < indices.Length; i++)
                {
                    indices[i] = lowerBounds[i];
                }
                for (int i = 0; i < totalLength; i++)
                {
                    bool complete = false;
                    for (int dim = rank - 1; dim >= 0; dim--)
                    {
                        if (indices[dim] >= lowerBounds[dim] + lengths[dim])
                        {
                            if (dim == 0)
                            {
                                complete = true;
                                break;
                            }
                            for (int j = dim; j < rank; j++)
                            {
                                indices[j] = lowerBounds[dim];
                            }
                            indices[dim - 1]++;
                        }
                    }
                    if (complete)
                    {
                        break;
                    }
                    object item = info.GetValue("Item" + i, arrType);
                    array.SetValue(item, indices);
                    indices[rank - 1]++;
                }
            }
        public static object Deserialize(Type type, string serializedValue)
        {
            if (serializedValue == null)
            {
                return(null);
            }

            if (typeof(IXunitSerializable).IsAssignableFrom(type))
            {
                return(DeserializeSerializable(type, serializedValue));
            }

            if (type == typeof(char?) || type == typeof(char))
            {
                return((char)ushort.Parse(serializedValue, CultureInfo.InvariantCulture));
            }

            if (type == typeof(string))
            {
                return(FromBase64(serializedValue));
            }

            if (type == typeof(byte?) || type == typeof(byte))
            {
                return(byte.Parse(serializedValue, CultureInfo.InvariantCulture));
            }

            if (type == typeof(sbyte?) || type == typeof(sbyte))
            {
                return(sbyte.Parse(serializedValue, CultureInfo.InvariantCulture));
            }

            if (type == typeof(short?) || type == typeof(short))
            {
                return(short.Parse(serializedValue, CultureInfo.InvariantCulture));
            }

            if (type == typeof(ushort?) || type == typeof(ushort))
            {
                return(ushort.Parse(serializedValue, CultureInfo.InvariantCulture));
            }

            if (type == typeof(int?) || type == typeof(int))
            {
                return(int.Parse(serializedValue, CultureInfo.InvariantCulture));
            }

            if (type == typeof(uint?) || type == typeof(uint))
            {
                return(uint.Parse(serializedValue, CultureInfo.InvariantCulture));
            }

            if (type == typeof(long?) || type == typeof(long))
            {
                return(long.Parse(serializedValue, CultureInfo.InvariantCulture));
            }

            if (type == typeof(ulong?) || type == typeof(ulong))
            {
                return(ulong.Parse(serializedValue, CultureInfo.InvariantCulture));
            }

            if (type == typeof(float?) || type == typeof(float))
            {
                var    arrSer = (ArraySerializer)DeserializeSerializable(typeof(ArraySerializer), serializedValue);
                byte[] bytes  = (byte[])arrSer.ArrayData;
                return(BitConverter.ToSingle(bytes, 0));
            }

            if (type == typeof(double?) || type == typeof(double))
            {
                var    arrSer = (ArraySerializer)DeserializeSerializable(typeof(ArraySerializer), serializedValue);
                byte[] bytes  = (byte[])arrSer.ArrayData;
                return(BitConverter.ToDouble(bytes, 0));
            }

            if (type == typeof(decimal?) || type == typeof(decimal))
            {
                return(decimal.Parse(serializedValue, CultureInfo.InvariantCulture));
            }

            if (type == typeof(bool?) || type == typeof(bool))
            {
                return(bool.Parse(serializedValue));
            }

            if (type == typeof(DateTime?) || type == typeof(DateTime))
            {
                var styles = serializedValue.EndsWith("Z", StringComparison.Ordinal) ? DateTimeStyles.AdjustToUniversal : DateTimeStyles.None;
                return(DateTime.Parse(serializedValue, CultureInfo.InvariantCulture, styles));
            }

            if (type == typeof(DateTimeOffset?) || type == typeof(DateTimeOffset))
            {
                var styles = serializedValue.EndsWith("Z", StringComparison.Ordinal) ? DateTimeStyles.AdjustToUniversal : DateTimeStyles.None;
                return(DateTimeOffset.Parse(serializedValue, CultureInfo.InvariantCulture, styles));
            }

            if (type == typeof(Type))
            {
                return(SerializationHelper.GetType(serializedValue));
            }

            if (type.IsEnum() || type.IsNullableEnum())
            {
                return(Enum.Parse(type.UnwrapNullable(), serializedValue));
            }

            if (type.IsArray)
            {
                var arrSer = (ArraySerializer)DeserializeSerializable(typeof(ArraySerializer), serializedValue);
                return(arrSer.ArrayData);
            }

            throw new ArgumentException("We don't know how to de-serialize type " + type.FullName, nameof(serializedValue));
        }