Структури (struct) та класи (class) є двома основними типами об’єктно-орієнтованого програмування (ООП) у мові програмування C++. Хоча вони можуть виглядати схоже з точки зору синтаксису, проте вони мають деякі відмінності, які слід враховувати при виборі…
Система управління базами даних (СУБД) Entity Framework Core є потужним інструментом для роботи з реляційними базами даних в середовищі .NET. Однією з ключових можливостей EF Core є підтримка зв’язків багато-до-одного між об’єктами. У цій статті…
This is my class with IYamlTypeConverter interface:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
using ExtremeEngineEditor; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Serialization; using YamlDotNet.Serialization.Utilities; namespace ExtremeEngine { public class SerializedObjectSerializer : IYamlTypeConverter { // Unfortunately the API does not provide those in the ReadYaml and WriteYaml // methods, so we are forced to set them after creation. public IValueSerializer ValueSerializer { get; set; } public IValueDeserializer ValueDeserializer { get; set; } public bool Accepts(Type type) => type != null && type == typeof(Map); public object ReadYaml(IParser parser, Type type) { //parser.Consume<YamlDotNet.Core.Events.Comment>(); parser.Consume<MappingStart>(); parser.Consume<Scalar>(); var result = Activator.CreateInstance(type); parser.Consume<MappingEnd>(); return result; } public void WriteYaml(IEmitter emitter, object? value, Type type) { emitter.Emit(new YamlDotNet.Core.Events.Comment(Application.ExtremeEngineName + " " + Application.ExtremeEngineVersion + " YAML file", false)); emitter.Emit(new MappingStart()); emitter.Emit(new YamlDotNet.Core.Events.Scalar("SerializedObject")); SerializeSerializedObject(emitter, new SerializedObject(value)); emitter.Emit(new YamlDotNet.Core.Events.MappingEnd()); } private class SerializedObjectSerializable { public string? TargetObjectQualifiedName; public IEnumerable<SerializedPropertySerializable> Properties; public SerializedObjectSerializable(SerializedObject serializedObject) { var allProperties = serializedObject.GetAllProperties(); int count = allProperties.Count(); List<SerializedPropertySerializable> newProperties = new(); for (int i = 0; i < count; i++) { newProperties.Add(new(allProperties.ElementAt(i))); } Properties = newProperties; TargetObjectQualifiedName = serializedObject.TargetObject.GetType().AssemblyQualifiedName; } public SerializedObject ToSerializedObject() { Debug.Log(TargetObjectQualifiedName); var newObject = Activator.CreateInstance(null, TargetObjectQualifiedName).Unwrap(); var fields = newObject.GetType().GetFields(); int count = Properties.Count(); for (int i = 0; i < count; i++) { for (int f = 0; f < fields.Length; f++) { Debug.Log(fields[f].Name); var property = Properties.ElementAt(i); if (fields[f].Name == property.FieldName) { fields[f].SetValue(newObject, property.Value); } } } return new SerializedObject(newObject); } public class SerializedPropertySerializable { public object? Value; public Type Type; public string FieldName; public SerializedPropertySerializable(SerializedProperty serializedProperty) { Value = serializedProperty.Value; Type = serializedProperty.PropertyType; FieldName = serializedProperty.Info.Name; } } } private void SerializeSerializedObject(IEmitter emitter, SerializedObject serializedObject) { ValueSerializer.SerializeValue(emitter, new SerializedObjectSerializable(serializedObject), typeof(SerializedObjectSerializable)); } private SerializedObject DeserializeSerializedObject(IParser parser) { Debug.Log(parser); SerializedObject? result = null; using (var state = new SerializerState()) { result = (ValueDeserializer.DeserializeValue(parser, typeof(SerializedObjectSerializable), state, ValueDeserializer) as SerializedObjectSerializable).ToSerializedObject(); state.OnDeserialization(); } return result; } } } |
I try to serialize an object with parameters and deserialize it.
Переповнення цілих чисел (integer overflow) є однією з типових проблем у програмуванні, особливо у мові C. У цій статті розглянемо, як воно виникає та найкращі практики для його уникнення. Переповнення цілих чисел відбувається, коли результат…
У процесі розробки гри, де гравці повинні переміщувати числа у масиві 3×3 з числами від 1 до 9 до тих пір, поки кожен ряд, стовпець та діагональ не утворять суму 15, важливо знати, коли гра…
При використанні C++23 та його нової функції views::join_with з’являється можливість об’єднати послідовність елементів у рядок за допомогою певного роздільника. Однак, чи можна використовувати багатохсимвольний роздільник?
У світі програмування часто виникає потреба в аналізі та обробці даних, особливо в області розробки програмного забезпечення. Однією з таких задач є парсинг класів у мові програмування C++. Регулярні вирази виявляються корисним інструментом у цьому…
Одним із найбільш актуальних питань для розробників програмного забезпечення є інтеграція з системами, що використовують аутентифікацію з двома факторами, зокрема, SharePoint Online. У даній статті розглянуто процес інтеграції аутентифікації SharePoint Online з додатком WinForms за…