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(); }
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; } } }