Пример #1
0
        void Write(UE_StructArray value, PositionToken position)
        {
            long length;

            byte[] _R;
            using (var ms = new MemoryStream())
                using (var bw = new UE_BinaryWriter(ms, true))
                {
                    long   length_length;
                    byte[] _R_R;
                    using (var ms_ms = new MemoryStream())
                        using (var bw_bw = new UE_BinaryWriter(ms_ms, true))
                        {
                            var ue_prop_w_w = new UE_Property_Writer(bw_bw);
                            for (int i = 0; i < value.ItemList.Length; i++)
                            {
                                ue_prop_w_w.Write_UE_Value(value.ItemList[i], PositionToken.InsideArray);
                            }
                            _R_R = ms_ms.ToArray();
                        }
                    length_length = _R_R.Length;
                    //
                    bw.Write(value.SA_Name);
                    bw.Write(value.SA_ItemType);
                    bw.Write(length_length);
                    var ue_prop_w = new UE_Property_Writer(bw);
                    ue_prop_w.Write_UE_Struct_Header(value.SA_StructTypeString);
                    bw.Write(_R_R, 0, _R_R.Length);
                    //
                    _R = ms.ToArray();
                }
            length = 4 + _R.Length;
            //
            Write_UE_Value_Hair(value.TypeString, length);
            Write_UE_Array_Header(value.ItemType);
            writer.Write(value.ItemList.Length);
            writer.Write(_R, 0, _R.Length);
        }
            static GvasFormat.UE_Value UE_Value(JsonReader reader, bool skip_start_token = false)
            {
                if (!skip_start_token)
                {
                    reader.AssertReadToken(JsonToken.StartObject);
                }
                string type_string = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_Value.TypeString);

                // code structure copied from GvasFormat.Serialization.Binary.UE_Property_Reader.Read_UE_Value
                GvasFormat.UE_Value result;
                switch (type_string)
                {
                //
                // non-container
                case UE_Value_TypeString.BoolProperty:
                    bool value_bool = reader.AssertReadPropertyNameValue <bool>(JsonNaming.UE_Value.Value);
                    result = new UE_ <bool>(type_string, value_bool);
                    break;

                case UE_Value_TypeString.ByteProperty:
                    byte value_byte = reader.AssertReadPropertyNameValue <byte>(JsonNaming.UE_Value.Value);
                    result = new UE_ <byte>(type_string, value_byte);
                    break;

                case UE_Value_TypeString.EnumProperty:
                    string enum_type  = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_Enum.EnumType);
                    string enum_value = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_Value.Value);
                    result = new UE_Enum(type_string, enum_type, enum_value);
                    break;

                case UE_Value_TypeString.FloatProperty:
                    float value_float = reader.AssertReadPropertyNameValue <float>(JsonNaming.UE_Value.Value);
                    result = new UE_ <float>(type_string, value_float);
                    break;

                case UE_Value_TypeString.IntProperty:
                    int value_int = reader.AssertReadPropertyNameValue <int>(JsonNaming.UE_Value.Value);
                    result = new UE_ <int>(type_string, value_int);
                    break;

                case UE_Value_TypeString.NameProperty:
                    //case UE_ValueTypeString.StrProperty:
                    string value_string = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_Value.Value);
                    result = new UE_ <string>(type_string, value_string);
                    break;

                //
                // container
                // redirect.
                // UE_Struct ... lots of them are not engine defined, but game author defined.
                case UE_Value_TypeString.StructProperty:
                    string struct_type = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_Struct.StructTypeString);
                    reader.AssertReadPropertyName(JsonNaming.UE_Value.Value);
                    switch (struct_type)
                    {
                    case UE_Value_TypeString.Struct.Vector:
                    case UE_Value_TypeString.Struct.Rotator:
                        reader.AssertReadToken(JsonToken.StartArray);
                        float x = reader.AssertReadValue <float>();
                        float y = reader.AssertReadValue <float>();
                        float z = reader.AssertReadValue <float>();
                        reader.AssertReadToken(JsonToken.EndArray);
                        result = new UE_Struct_Vector(struct_type, x, y, z);
                        break;

                    case UE_Value_TypeString.Struct.Quat:
                        reader.AssertReadToken(JsonToken.StartArray);
                        float a = reader.AssertReadValue <float>();
                        float b = reader.AssertReadValue <float>();
                        float c = reader.AssertReadValue <float>();
                        float d = reader.AssertReadValue <float>();
                        reader.AssertReadToken(JsonToken.EndArray);
                        result = new UE_Struct_Quat(struct_type, a, b, c, d);
                        break;

                    default:
                        List <UE_Property> property_list = Read.Object_as_PropertyList(reader);
                        result = new UE_Struct_Generic(struct_type, property_list);
                        break;
                    }
                    break;

                case UE_Value_TypeString.ArrayProperty:
                    string item_type = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_Array.ItemType);
                    reader.AssertReadPropertyNameValue <int>(JsonNaming.UE_Map.Count);
                    List <GvasFormat.UE_Value> item_list;
                    if (item_type == UE_Value_TypeString.StructProperty)
                    {
                        string sa_name               = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_StructArray.SA_Name);
                        string sa_item_type          = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_StructArray.SA_ItemType);
                        string sa_struct_type_string = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_StructArray.SA_StructTypeString);
                        reader.AssertReadPropertyName(JsonNaming.UE_Array.ItemList);
                        item_list = Read.UE_Value_List(reader);
                        result    = new UE_StructArray(type_string, item_type, item_list.Count, item_list.ToArray(), sa_name, sa_item_type, sa_struct_type_string);
                    }
                    else
                    {
                        reader.AssertReadPropertyName(JsonNaming.UE_Array.ItemList);
                        item_list = Read.UE_Value_List(reader);
                        result    = new UE_Array(type_string, item_type, item_list.Count, item_list.ToArray());
                    }
                    break;

                case UE_Value_TypeString.MapProperty:
                    string key_type   = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_Map.KeyType);
                    string value_type = reader.AssertReadPropertyNameValue <string>(JsonNaming.UE_Map.ValueType);
                    reader.AssertReadPropertyNameValue <int>(JsonNaming.UE_Map.Count);
                    reader.AssertReadPropertyName(JsonNaming.UE_Map.Map);
                    reader.AssertReadToken(JsonToken.StartArray);
                    var map = new List <UE_Map_KeyValuePair>();
                    while (true)
                    {
                        var token = reader.AssertRead();
                        if (token == JsonToken.StartObject)
                        {
                            reader.AssertReadPropertyName(JsonNaming.UE_Map_KeyValuePair.Key);
                            UE_Value key = Read.UE_Value(reader);
                            reader.AssertReadPropertyName(JsonNaming.UE_Map_KeyValuePair.Value);
                            UE_Value value = Read.UE_Value(reader);
                            reader.AssertReadToken(JsonToken.EndObject);
                            UE_Map_KeyValuePair kvp = new UE_Map_KeyValuePair(key, value);
                            map.Add(kvp);
                        }
                        else if (token == JsonToken.EndArray)
                        {
                            break;
                        }
                        else
                        {
                            throw new FormatException();
                        }
                    }
                    result = new UE_Map(type_string, key_type, value_type, map.Count, map);
                    break;

                default:
                    throw new FormatException($"Unknown value type `{type_string}`.");
                }
                reader.AssertReadToken(JsonToken.EndObject);
                return(result);
            }
            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();
            }