UE_StructArray Read_UE_StructArray(ValueInfo value_info, string item_type)
        {
            int count = reader.ReadInt32();

            if (reader.PeekChar() < 0)
            {
                throw new Exception();
            }
            string sa_name = reader.ReadString();
            //if (SA_Name != array_name) { throw new Exception(); }
            string sa_item_type = reader.ReadString();

            if (sa_item_type != item_type)
            {
                throw new Exception();
            }
            var __valueLength = reader.ReadInt64(); // after struct header terminator.

            UE_Struct[] item_list             = new UE_Struct[count];
            string      sa_struct_type_string = Read_UE_Struct_Header();

            // __valueLength begins here.
            for (int i = 0; i < count; i++)
            {
                item_list[i] = Read_UE_Struct(sa_struct_type_string);
            }
            return(new UE_StructArray(value_info.type, item_type, count, item_list, sa_name, sa_item_type, sa_struct_type_string));
        }
            static void UE_Value(JsonWriter writer, GvasFormat.UE_Value value)
            {
                writer.WriteStartObject();

                writer.WritePropertyName(JsonNaming.UE_Value.TypeString);
                writer.WriteValue(value.TypeString);

                Type value_cs_type = value.GetType();

                // Non-container Type
                if (value_cs_type == typeof(UE_ <bool>))
                {
                    writer.WritePropertyName(JsonNaming.UE_Value.Value);
                    writer.WriteValue(((UE_ <bool>)value).Value);
                }
                else if (value_cs_type == typeof(UE_ <byte>))
                {
                    writer.WritePropertyName(JsonNaming.UE_Value.Value);
                    writer.WriteValue(((UE_ <byte>)value).Value);
                }
                else if (value_cs_type == typeof(UE_Enum))
                {
                    UE_Enum value_enum = (UE_Enum)value;

                    writer.WritePropertyName(JsonNaming.UE_Enum.EnumType);
                    writer.WriteValue(value_enum.EnumType);

                    writer.WritePropertyName(JsonNaming.UE_Value.Value);
                    writer.WriteValue(value_enum.Value);
                }
                else if (value_cs_type == typeof(UE_ <float>))
                {
                    writer.WritePropertyName(JsonNaming.UE_Value.Value);
                    writer.WriteValue(((UE_ <float>)value).Value);
                }
                else if (value_cs_type == typeof(UE_ <int>))
                {
                    writer.WritePropertyName(JsonNaming.UE_Value.Value);
                    writer.WriteValue(((UE_ <int>)value).Value);
                }
                else if (value_cs_type == typeof(UE_ <string>))
                {
                    writer.WritePropertyName(JsonNaming.UE_Value.Value);
                    writer.WriteValue(((UE_ <string>)value).Value);
                }
                // Container Type
                else if (value_cs_type == typeof(UE_Map))
                {
                    UE_Map value_map = (UE_Map)value;

                    writer.WritePropertyName(JsonNaming.UE_Map.KeyType);
                    writer.WriteValue(value_map.KeyType);

                    writer.WritePropertyName(JsonNaming.UE_Map.ValueType);
                    writer.WriteValue(value_map.ValueType);

                    writer.WritePropertyName(JsonNaming.UE_Map.Count);
                    writer.WriteValue(value_map.Count);

                    writer.WritePropertyName(JsonNaming.UE_Map.Map);
                    {
                        writer.WriteStartArray();

                        foreach (UE_Map_KeyValuePair keyValuePair in value_map.Map)
                        {
                            writer.WriteStartObject();

                            writer.WritePropertyName(JsonNaming.UE_Map_KeyValuePair.Key);
                            Write.UE_Value(writer, keyValuePair.Key);

                            writer.WritePropertyName(JsonNaming.UE_Map_KeyValuePair.Value);
                            Write.UE_Value(writer, keyValuePair.Value);

                            writer.WriteEndObject();
                        }

                        writer.WriteEndArray();
                    }
                }
                else if (value_cs_type == typeof(UE_Array))
                {
                    UE_Array value_array = (UE_Array)value;

                    writer.WritePropertyName(JsonNaming.UE_Array.ItemType);
                    writer.WriteValue(value_array.ItemType);

                    writer.WritePropertyName(JsonNaming.UE_Array.Count);
                    writer.WriteValue(value_array.Count);

                    writer.WritePropertyName(JsonNaming.UE_Array.ItemList);
                    {
                        writer.WriteStartArray();

                        foreach (UE_Value item in value_array.ItemList)
                        {
                            Write.UE_Value(writer, item);
                        }

                        writer.WriteEndArray();
                    }
                }
                else if (value_cs_type == typeof(UE_StructArray))
                {
                    UE_Array value_array = (UE_Array)value;

                    writer.WritePropertyName(JsonNaming.UE_Array.ItemType);
                    writer.WriteValue(value_array.ItemType);

                    writer.WritePropertyName(JsonNaming.UE_Array.Count);
                    writer.WriteValue(value_array.Count);

                    UE_StructArray value_struct_array = (UE_StructArray)value;

                    writer.WritePropertyName(JsonNaming.UE_StructArray.SA_Name);
                    writer.WriteValue(value_struct_array.SA_Name);

                    writer.WritePropertyName(JsonNaming.UE_StructArray.SA_ItemType);
                    writer.WriteValue(value_struct_array.SA_ItemType);

                    writer.WritePropertyName(JsonNaming.UE_StructArray.SA_StructTypeString);
                    writer.WriteValue(value_struct_array.SA_StructTypeString);

                    writer.WritePropertyName(JsonNaming.UE_Array.ItemList);
                    {
                        writer.WriteStartArray();

                        foreach (UE_Value item in value_array.ItemList)
                        {
                            Write.UE_Value(writer, item);
                        }

                        writer.WriteEndArray();
                    }
                }
                // Struct Type
                else if (value_cs_type == typeof(UE_Struct_Vector))
                {
                    UE_Struct value_struct = (UE_Struct)value;

                    writer.WritePropertyName(JsonNaming.UE_Struct.StructTypeString);
                    writer.WriteValue(value_struct.StructTypeString);

                    writer.WritePropertyName(JsonNaming.UE_Value.Value);
                    UE_Struct_Vector value_struct_vector = (UE_Struct_Vector)value;
                    {
                        writer.WriteStartArray();

                        writer.WriteValue(value_struct_vector.X);
                        writer.WriteValue(value_struct_vector.Y);
                        writer.WriteValue(value_struct_vector.Z);

                        writer.WriteEndArray();
                    }
                }
                else if (value_cs_type == typeof(UE_Struct_Quat))
                {
                    UE_Struct value_struct = (UE_Struct)value;

                    writer.WritePropertyName(JsonNaming.UE_Struct.StructTypeString);
                    writer.WriteValue(value_struct.StructTypeString);

                    writer.WritePropertyName(JsonNaming.UE_Value.Value);
                    UE_Struct_Quat value_struct_quat = (UE_Struct_Quat)value;
                    {
                        writer.WriteStartArray();

                        writer.WriteValue(value_struct_quat.A);
                        writer.WriteValue(value_struct_quat.B);
                        writer.WriteValue(value_struct_quat.C);
                        writer.WriteValue(value_struct_quat.D);

                        writer.WriteEndArray();
                    }
                }
                else if (value_cs_type == typeof(UE_Struct_Generic))
                {
                    UE_Struct value_struct = (UE_Struct)value;

                    writer.WritePropertyName(JsonNaming.UE_Struct.StructTypeString);
                    writer.WriteValue(value_struct.StructTypeString);

                    writer.WritePropertyName(JsonNaming.UE_Value.Value);
                    UE_Struct_Generic value_struct_generic = (UE_Struct_Generic)value;
                    Write.PropertyList_as_Object(writer, value_struct_generic.PropertyList);
                }
                else
                {
                    throw new NotImplementedException(value_cs_type.ToString());
                }

                writer.WriteEndObject();
            }