示例#1
0
        private static void SaveToFile(string fileName)
        {
            using FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);
            using Utf8JsonWriter writer = new Utf8JsonWriter(fileStream, new JsonWriterOptions()
            {
                Indented = true
            });

            writer.WriteStartObject();
            foreach (PropertyInfo property in typeof(Settings).GetProperties(BindingFlags.Static | BindingFlags.Public))
            {
                object value = property.GetValue(null);
                if (value is string stringValue)
                {
                    writer.WriteString(property.Name, stringValue);
                }
                else if (value is int intValue)
                {
                    writer.WriteNumber(property.Name, intValue);
                }
                else if (value is uint uintValue)
                {
                    writer.WriteNumber(property.Name, uintValue);
                }
                else if (value is float floatValue)
                {
                    writer.WriteNumber(property.Name, floatValue);
                }
                else if (value is double doubleValue)
                {
                    writer.WriteNumber(property.Name, doubleValue);
                }
                else if (value is List <Regex> regexList)
                {
                    writer.WritePropertyName(property.Name);

                    JsonRegexListConverter regexListConverter = new JsonRegexListConverter();
                    regexListConverter.Write(writer, regexList, null);
                }
                else
                {
                    throw new JsonException($"Unknown value type {property.PropertyType.Name}");
                }
            }
            writer.WriteEndObject();
        }
示例#2
0
        private static void LoadFromFile(string fileName)
        {
            byte[] content;
            using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                content = new byte[fileStream.Length];
                fileStream.Read(content, 0, (int)fileStream.Length);
            }

            Utf8JsonReader reader   = new Utf8JsonReader(content);
            PropertyInfo   property = null;

            while (reader.Read())
            {
                switch (reader.TokenType)
                {
                case JsonTokenType.PropertyName:
                    string propertyName = reader.GetString();
                    property = typeof(Settings).GetProperty(propertyName, BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase);
                    if (property == null || Attribute.IsDefined(property, typeof(JsonIgnoreAttribute)))
                    {
                        // Skip non-existent and ignored properties
                        if (reader.Read())
                        {
                            if (reader.TokenType == JsonTokenType.StartArray)
                            {
                                while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
                                {
                                }
                            }
                            else if (reader.TokenType == JsonTokenType.StartObject)
                            {
                                while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
                                {
                                }
                            }
                        }
                    }
                    break;

                case JsonTokenType.Number:
                    if (property.PropertyType == typeof(int))
                    {
                        property.SetValue(null, reader.GetInt32());
                    }
                    else if (property.PropertyType == typeof(uint))
                    {
                        property.SetValue(null, reader.GetUInt32());
                    }
                    else if (property.PropertyType == typeof(float))
                    {
                        property.SetValue(null, reader.GetSingle());
                    }
                    else if (property.PropertyType == typeof(double))
                    {
                        property.SetValue(null, reader.GetDouble());
                    }
                    else
                    {
                        throw new JsonException($"Bad number type: {property.PropertyType.Name}");
                    }
                    break;

                case JsonTokenType.String:
                    if (property.PropertyType == typeof(string))
                    {
                        property.SetValue(null, reader.GetString());
                    }
                    else
                    {
                        throw new JsonException($"Bad string type: {property.PropertyType.Name}");
                    }
                    break;

                case JsonTokenType.StartArray:
                    if (property.PropertyType == typeof(List <Regex>))
                    {
                        JsonRegexListConverter regexListConverter = new JsonRegexListConverter();
                        property.SetValue(null, regexListConverter.Read(ref reader, typeof(List <Regex>), null));
                    }
                    else
                    {
                        throw new JsonException($"Bad list type: {property.PropertyType.Name}");
                    }
                    break;
                }
            }
        }