refactor: Yaml serialization moved from Core to own project
This commit is contained in:
parent
bd5eb432b7
commit
131203d578
4
.gitmodules
vendored
4
.gitmodules
vendored
@ -1,3 +1,3 @@
|
|||||||
[submodule "YamlDotNet"]
|
[submodule "Engine.Serializers/YamlDotNet"]
|
||||||
path = YamlDotNet
|
path = Engine.Serializers/YamlDotNet
|
||||||
url = git@github.com:Syntriax/YamlDotNet.git
|
url = git@github.com:Syntriax/YamlDotNet.git
|
||||||
|
@ -7,8 +7,4 @@
|
|||||||
<RootNamespace>Syntriax.Engine.Core</RootNamespace>
|
<RootNamespace>Syntriax.Engine.Core</RootNamespace>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\YamlDotNet\YamlDotNet\YamlDotNet.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,35 +1,3 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public record class EntityReference(string? Id = null);
|
public record class EntityReference(string? Id = null);
|
||||||
|
|
||||||
public class EntityRegistry
|
|
||||||
{
|
|
||||||
public event EntityRegisteredEventHandler? OnEntityRegistered = null!;
|
|
||||||
|
|
||||||
private readonly Dictionary<string, Action<IEntity>?> assignCallbacks = [];
|
|
||||||
private readonly Dictionary<string, IEntity> registeredEntities = [];
|
|
||||||
public IReadOnlyDictionary<string, IEntity> RegisteredEntities => registeredEntities;
|
|
||||||
|
|
||||||
public void Add(IEntity entity)
|
|
||||||
{
|
|
||||||
if (registeredEntities.TryAdd(entity.Id, entity))
|
|
||||||
OnEntityRegistered?.InvokeSafe(this, entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void QueueAssign(string id, Action<IEntity> setMethod)
|
|
||||||
{
|
|
||||||
assignCallbacks.TryAdd(id, null);
|
|
||||||
assignCallbacks[id] = assignCallbacks[id] + setMethod;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AssignAll()
|
|
||||||
{
|
|
||||||
foreach ((string id, Action<IEntity>? action) in assignCallbacks)
|
|
||||||
action?.InvokeSafe(registeredEntities[id]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public delegate void EntityRegisteredEventHandler(EntityRegistry sender, IEntity entity);
|
|
||||||
}
|
|
||||||
|
39
Engine.Core/Serialization/EntityRegistry.cs
Normal file
39
Engine.Core/Serialization/EntityRegistry.cs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
|
public class EntityRegistry
|
||||||
|
{
|
||||||
|
public event EntityRegisteredEventHandler? OnEntityRegistered = null!;
|
||||||
|
|
||||||
|
private readonly Dictionary<string, Action<IEntity>?> assignCallbacks = [];
|
||||||
|
private readonly Dictionary<string, IEntity> registeredEntities = [];
|
||||||
|
public IReadOnlyDictionary<string, IEntity> RegisteredEntities => registeredEntities;
|
||||||
|
|
||||||
|
public void Add(IEntity entity)
|
||||||
|
{
|
||||||
|
if (registeredEntities.TryAdd(entity.Id, entity))
|
||||||
|
OnEntityRegistered?.InvokeSafe(this, entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void QueueAssign(string id, Action<IEntity> setMethod)
|
||||||
|
{
|
||||||
|
assignCallbacks.TryAdd(id, null);
|
||||||
|
assignCallbacks[id] = assignCallbacks[id] + setMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AssignAll()
|
||||||
|
{
|
||||||
|
foreach ((string id, Action<IEntity>? action) in assignCallbacks)
|
||||||
|
action?.InvokeSafe(registeredEntities[id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset()
|
||||||
|
{
|
||||||
|
assignCallbacks.Clear();
|
||||||
|
registeredEntities.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public delegate void EntityRegisteredEventHandler(EntityRegistry sender, IEntity entity);
|
||||||
|
}
|
12
Engine.Core/Serialization/ISerializer.cs
Normal file
12
Engine.Core/Serialization/ISerializer.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
|
public interface ISerializer
|
||||||
|
{
|
||||||
|
object Deserialize(string configuration);
|
||||||
|
object Deserialize(string configuration, Type type);
|
||||||
|
T Deserialize<T>(string configuration);
|
||||||
|
|
||||||
|
string Serialize(object instance);
|
||||||
|
}
|
@ -26,7 +26,7 @@ public class SerializedClass
|
|||||||
Type type = @class.GetType();
|
Type type = @class.GetType();
|
||||||
Type = type.FullName ?? type.Name;
|
Type = type.FullName ?? type.Name;
|
||||||
|
|
||||||
bool isFullySerializable = type.HasAttribute<SerializeAllAttribute>();
|
bool shouldSerializeAll = type.HasAttribute<SerializeAllAttribute>();
|
||||||
|
|
||||||
Public.Clear();
|
Public.Clear();
|
||||||
Private.Clear();
|
Private.Clear();
|
||||||
@ -39,7 +39,7 @@ public class SerializedClass
|
|||||||
if (privatePropertyInfo.SetMethod is null)
|
if (privatePropertyInfo.SetMethod is null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!isFullySerializable && !privatePropertyInfo.HasAttribute<SerializeAttribute>())
|
if (!shouldSerializeAll && !privatePropertyInfo.HasAttribute<SerializeAttribute>())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
object? value = privatePropertyInfo.GetValue(@class);
|
object? value = privatePropertyInfo.GetValue(@class);
|
||||||
@ -57,7 +57,7 @@ public class SerializedClass
|
|||||||
if (publicPropertyInfo.SetMethod is null)
|
if (publicPropertyInfo.SetMethod is null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!isFullySerializable && !publicPropertyInfo.HasAttribute<SerializeAttribute>())
|
if (!shouldSerializeAll && !publicPropertyInfo.HasAttribute<SerializeAttribute>())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
object? value = publicPropertyInfo.GetValue(@class);
|
object? value = publicPropertyInfo.GetValue(@class);
|
||||||
@ -72,7 +72,7 @@ public class SerializedClass
|
|||||||
if (privateFieldInfo.HasAttribute<System.Runtime.CompilerServices.CompilerGeneratedAttribute>())
|
if (privateFieldInfo.HasAttribute<System.Runtime.CompilerServices.CompilerGeneratedAttribute>())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!isFullySerializable && !privateFieldInfo.HasAttribute<SerializeAttribute>())
|
if (!shouldSerializeAll && !privateFieldInfo.HasAttribute<SerializeAttribute>())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
object? value = privateFieldInfo.GetValue(@class);
|
object? value = privateFieldInfo.GetValue(@class);
|
||||||
@ -87,7 +87,7 @@ public class SerializedClass
|
|||||||
if (publicFieldInfo.HasAttribute<System.Runtime.CompilerServices.CompilerGeneratedAttribute>())
|
if (publicFieldInfo.HasAttribute<System.Runtime.CompilerServices.CompilerGeneratedAttribute>())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!isFullySerializable && !publicFieldInfo.HasAttribute<SerializeAttribute>())
|
if (!shouldSerializeAll && !publicFieldInfo.HasAttribute<SerializeAttribute>())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
object? value = publicFieldInfo.GetValue(@class);
|
object? value = publicFieldInfo.GetValue(@class);
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
using YamlDotNet.Serialization;
|
|
||||||
using YamlDotNet.Serialization.NamingConventions;
|
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
|
||||||
|
|
||||||
public static class Serializer
|
|
||||||
{
|
|
||||||
private static readonly ISerializer serializer = GetSerializer();
|
|
||||||
private static ISerializer GetSerializer()
|
|
||||||
{
|
|
||||||
SerializerBuilder serializerBuilder = new SerializerBuilder()
|
|
||||||
.WithNamingConvention(PascalCaseNamingConvention.Instance)
|
|
||||||
.DisableAliases();
|
|
||||||
|
|
||||||
foreach (IEngineTypeYamlSerializer typeConverter in GetEngineYamlTypeConverters())
|
|
||||||
serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter);
|
|
||||||
|
|
||||||
return serializerBuilder.Build();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static IDeserializer GetDeserializer(EntityRegistry entityRegistry)
|
|
||||||
{
|
|
||||||
DeserializerBuilder serializerBuilder = new DeserializerBuilder()
|
|
||||||
.WithNamingConvention(PascalCaseNamingConvention.Instance);
|
|
||||||
|
|
||||||
foreach (IEngineTypeYamlSerializer typeConverter in GetEngineYamlTypeConverters())
|
|
||||||
{
|
|
||||||
typeConverter.EntityRegistry = entityRegistry;
|
|
||||||
serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter);
|
|
||||||
}
|
|
||||||
|
|
||||||
return serializerBuilder.Build();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static IEnumerable<IEngineTypeYamlSerializer> GetEngineYamlTypeConverters()
|
|
||||||
{
|
|
||||||
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes().Where(t => typeof(IEngineTypeYamlSerializer).IsAssignableFrom(t) && t.IsClass && !t.IsAbstract))
|
|
||||||
yield return (Activator.CreateInstance(type) as IEngineTypeYamlSerializer)!;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string Serialize(object instance)
|
|
||||||
{
|
|
||||||
return serializer.Serialize(instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object Deserialize(string yaml)
|
|
||||||
{
|
|
||||||
EntityRegistry entityRegistry = new();
|
|
||||||
object result = GetDeserializer(entityRegistry).Deserialize(yaml)!;
|
|
||||||
entityRegistry.AssignAll();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object Deserialize(string yaml, Type type)
|
|
||||||
{
|
|
||||||
EntityRegistry entityRegistry = new();
|
|
||||||
object result = GetDeserializer(entityRegistry).Deserialize(yaml, type)!;
|
|
||||||
entityRegistry.AssignAll();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static T Deserialize<T>(string yaml)
|
|
||||||
{
|
|
||||||
EntityRegistry entityRegistry = new();
|
|
||||||
T result = GetDeserializer(entityRegistry).Deserialize<T>(yaml);
|
|
||||||
entityRegistry.AssignAll();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
using YamlDotNet.Serialization;
|
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
|
||||||
|
|
||||||
public interface IEngineTypeYamlSerializer : IYamlTypeConverter
|
|
||||||
{
|
|
||||||
EntityRegistry EntityRegistry { get; set; }
|
|
||||||
}
|
|
@ -5,12 +5,12 @@ using System.Reflection;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
internal static class Utils
|
public static class Utils
|
||||||
{
|
{
|
||||||
internal static bool HasAttribute<T>(this MemberInfo memberInfo) where T : Attribute => memberInfo.GetCustomAttribute<T>() is not null;
|
public static bool HasAttribute<T>(this MemberInfo memberInfo) where T : Attribute => memberInfo.GetCustomAttribute<T>() is not null;
|
||||||
internal static bool IsEnumerable(this Type type) => typeof(System.Collections.IEnumerable).IsAssignableFrom(type) && type != typeof(string);
|
public static bool IsEnumerable(this Type type) => typeof(System.Collections.IEnumerable).IsAssignableFrom(type) && type != typeof(string);
|
||||||
|
|
||||||
internal static TypeData GetTypeData(this Type objectType)
|
public static TypeData GetTypeData(this Type objectType)
|
||||||
{
|
{
|
||||||
List<EventInfo> eventInfos = objectType.GetEvents(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
|
List<EventInfo> eventInfos = objectType.GetEvents(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
|
||||||
.OrderBy(ei => ei.Name)
|
.OrderBy(ei => ei.Name)
|
||||||
@ -26,7 +26,7 @@ internal static class Utils
|
|||||||
return new TypeData(fieldInfos, propertyInfos);
|
return new TypeData(fieldInfos, propertyInfos);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static List<FieldInfo> GetFieldInfosIncludingBaseClasses(Type type, BindingFlags bindingFlags)
|
public static List<FieldInfo> GetFieldInfosIncludingBaseClasses(Type type, BindingFlags bindingFlags)
|
||||||
{
|
{
|
||||||
if (type.BaseType is null)
|
if (type.BaseType is null)
|
||||||
return [.. type.GetFields(bindingFlags)];
|
return [.. type.GetFields(bindingFlags)];
|
||||||
@ -44,7 +44,7 @@ internal static class Utils
|
|||||||
return [.. fieldInfoList.OrderBy(fi => fi.Name)];
|
return [.. fieldInfoList.OrderBy(fi => fi.Name)];
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static List<PropertyInfo> GetPropertyInfosIncludingBaseClasses(Type type, BindingFlags bindingFlags)
|
public static List<PropertyInfo> GetPropertyInfosIncludingBaseClasses(Type type, BindingFlags bindingFlags)
|
||||||
{
|
{
|
||||||
if (type.BaseType is null)
|
if (type.BaseType is null)
|
||||||
return [.. type.GetProperties(bindingFlags)];
|
return [.. type.GetProperties(bindingFlags)];
|
||||||
@ -75,7 +75,7 @@ internal static class Utils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal record struct TypeData(IEnumerable<FieldInfo> Fields, IEnumerable<PropertyInfo> Properties)
|
public record struct TypeData(IEnumerable<FieldInfo> Fields, IEnumerable<PropertyInfo> Properties)
|
||||||
{
|
{
|
||||||
public static implicit operator (IEnumerable<FieldInfo> fields, IEnumerable<PropertyInfo> properties)(TypeData value) => (value.Fields, value.Properties);
|
public static implicit operator (IEnumerable<FieldInfo> fields, IEnumerable<PropertyInfo> properties)(TypeData value) => (value.Fields, value.Properties);
|
||||||
public static implicit operator TypeData((IEnumerable<FieldInfo> fields, IEnumerable<PropertyInfo> properties) value) => new(value.fields, value.properties);
|
public static implicit operator TypeData((IEnumerable<FieldInfo> fields, IEnumerable<PropertyInfo> properties) value) => new(value.fields, value.properties);
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
|
public interface IEngineTypeYamlConverter : IYamlTypeConverter
|
||||||
|
{
|
||||||
|
YamlSerializer Serializer { get; set; }
|
||||||
|
EntityRegistry EntityRegistry { get; set; }
|
||||||
|
}
|
@ -2,13 +2,16 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class BehaviourControllerSerializer : EngineTypeYamlSerializerBase<IBehaviourController>
|
public class BehaviourControllerConverter : EngineTypeYamlSerializerBase<IBehaviourController>
|
||||||
{
|
{
|
||||||
private const string BEHAVIOURS_SCALAR_NAME = "Behaviours";
|
private const string BEHAVIOURS_SCALAR_NAME = "Behaviours";
|
||||||
|
|
@ -1,12 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class BehaviourSerializer : EngineTypeYamlSerializerBase<IBehaviour>
|
public class BehaviourConverter : EngineTypeYamlSerializerBase<IBehaviour>
|
||||||
{
|
{
|
||||||
public override IBehaviour? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override IBehaviour? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
@ -1,15 +1,19 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public abstract class EngineTypeYamlSerializerBase<T> : IEngineTypeYamlSerializer
|
public abstract class EngineTypeYamlSerializerBase<T> : IEngineTypeYamlConverter
|
||||||
{
|
{
|
||||||
protected const string SERIALIZED_SCALAR_NAME = "Properties";
|
protected const string SERIALIZED_SCALAR_NAME = "Properties";
|
||||||
|
|
||||||
public EntityRegistry EntityRegistry { get; set; } = null!;
|
public EntityRegistry EntityRegistry { get; set; } = null!;
|
||||||
|
public YamlSerializer Serializer { get; set; } = null!;
|
||||||
|
|
||||||
public bool Accepts(Type type) => typeof(T).IsAssignableFrom(type);
|
public bool Accepts(Type type) => typeof(T).IsAssignableFrom(type);
|
||||||
|
|
@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class AABBSerializer : EngineTypeYamlSerializerBase<AABB>
|
public class AABBConverter : EngineTypeYamlSerializerBase<AABB>
|
||||||
{
|
{
|
||||||
public override AABB Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override AABB Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
||||||
@ -36,5 +38,4 @@ public class AABBSerializer : EngineTypeYamlSerializerBase<AABB>
|
|||||||
serializer(aabb.UpperBoundary, typeof(Vector2D));
|
serializer(aabb.UpperBoundary, typeof(Vector2D));
|
||||||
emitter.Emit(new MappingEnd());
|
emitter.Emit(new MappingEnd());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class CircleSerializer : EngineTypeYamlSerializerBase<Circle>
|
public class CircleConverter : EngineTypeYamlSerializerBase<Circle>
|
||||||
{
|
{
|
||||||
public override Circle Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override Circle Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class Line2DSerializer : EngineTypeYamlSerializerBase<Line2D>
|
public class Line2DConverter : EngineTypeYamlSerializerBase<Line2D>
|
||||||
{
|
{
|
||||||
public override Line2D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override Line2D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class Line2DEquationSerializer : EngineTypeYamlSerializerBase<Line2DEquation>
|
public class Line2DEquationConverter : EngineTypeYamlSerializerBase<Line2DEquation>
|
||||||
{
|
{
|
||||||
public override Line2DEquation Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override Line2DEquation Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class Projection1DSerializer : EngineTypeYamlSerializerBase<Projection1D>
|
public class Projection1DConverter : EngineTypeYamlSerializerBase<Projection1D>
|
||||||
{
|
{
|
||||||
public override Projection1D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override Projection1D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class QuaternionSerializer : EngineTypeYamlSerializerBase<Quaternion>
|
public class QuaternionConverter : EngineTypeYamlSerializerBase<Quaternion>
|
||||||
{
|
{
|
||||||
private static readonly int SUBSTRING_START_LENGTH = nameof(Quaternion).Length + 1;
|
private static readonly int SUBSTRING_START_LENGTH = nameof(Quaternion).Length + 1;
|
||||||
|
|
@ -1,13 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class Shape2DSerializer : EngineTypeYamlSerializerBase<Shape2D>
|
public class Shape2DConverter : EngineTypeYamlSerializerBase<Shape2D>
|
||||||
{
|
{
|
||||||
public override Shape2D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override Shape2D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class TriangleSerializer : EngineTypeYamlSerializerBase<Triangle>
|
public class TriangleConverter : EngineTypeYamlSerializerBase<Triangle>
|
||||||
{
|
{
|
||||||
public override Triangle Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override Triangle Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class Vector2DSerializer : EngineTypeYamlSerializerBase<Vector2D>
|
public class Vector2DConverter : EngineTypeYamlSerializerBase<Vector2D>
|
||||||
{
|
{
|
||||||
private static readonly int SUBSTRING_START_LENGTH = nameof(Vector2D).Length + 1;
|
private static readonly int SUBSTRING_START_LENGTH = nameof(Vector2D).Length + 1;
|
||||||
|
|
@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class Vector3DSerializer : EngineTypeYamlSerializerBase<Vector3D>
|
public class Vector3DConverter : EngineTypeYamlSerializerBase<Vector3D>
|
||||||
{
|
{
|
||||||
private static readonly int SUBSTRING_START_LENGTH = nameof(Vector3D).Length + 1;
|
private static readonly int SUBSTRING_START_LENGTH = nameof(Vector3D).Length + 1;
|
||||||
|
|
@ -2,15 +2,16 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
using Syntriax.Engine.Core.Factory;
|
using Syntriax.Engine.Core.Factory;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class SerializedClassSerializer : EngineTypeYamlSerializerBase<SerializedClass>
|
public class SerializedClassConverter : EngineTypeYamlSerializerBase<SerializedClass>
|
||||||
{
|
{
|
||||||
public override SerializedClass? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override SerializedClass? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
||||||
@ -33,10 +34,10 @@ public class SerializedClassSerializer : EngineTypeYamlSerializerBase<Serialized
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ((string key, TypeContainer typeContainer) in publicDictionary)
|
foreach ((string key, TypeContainer typeContainer) in publicDictionary)
|
||||||
serializedClass.Public.Add(key, Serializer.Deserialize(typeContainer.Value!.ToString()!, TypeFactory.GetType(typeContainer.Type)));
|
serializedClass.Public.Add(key, Serializer.InternalDeserialize(typeContainer.Value!.ToString()!, TypeFactory.GetType(typeContainer.Type)));
|
||||||
|
|
||||||
foreach ((string key, TypeContainer typeContainer) in privateDictionary)
|
foreach ((string key, TypeContainer typeContainer) in privateDictionary)
|
||||||
serializedClass.Private.Add(key, Serializer.Deserialize(typeContainer.Value!.ToString()!, TypeFactory.GetType(typeContainer.Type)));
|
serializedClass.Private.Add(key, Serializer.InternalDeserialize(typeContainer.Value!.ToString()!, TypeFactory.GetType(typeContainer.Type)));
|
||||||
|
|
||||||
return serializedClass;
|
return serializedClass;
|
||||||
}
|
}
|
@ -1,12 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class StateEnableSerializer : EngineTypeYamlSerializerBase<IStateEnable>
|
public class StateEnableConverter : EngineTypeYamlSerializerBase<IStateEnable>
|
||||||
{
|
{
|
||||||
public override IStateEnable? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override IStateEnable? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
@ -1,14 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
using Syntriax.Engine.Core.Factory;
|
using Syntriax.Engine.Core.Factory;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class TypeContainerSerializer : EngineTypeYamlSerializerBase<TypeContainer>
|
public class TypeContainerConverter : EngineTypeYamlSerializerBase<TypeContainer>
|
||||||
{
|
{
|
||||||
public override TypeContainer Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override TypeContainer Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
@ -2,13 +2,16 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class UniverseSerializer : EngineTypeYamlSerializerBase<IUniverse>
|
public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
|
||||||
{
|
{
|
||||||
public override IUniverse? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
public override IUniverse? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
{
|
{
|
@ -2,11 +2,14 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core;
|
||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
using YamlDotNet.Core;
|
using YamlDotNet.Core;
|
||||||
using YamlDotNet.Core.Events;
|
using YamlDotNet.Core.Events;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseObject>
|
public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseObject>
|
||||||
{
|
{
|
@ -0,0 +1,15 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>false</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<RootNamespace>Syntriax.Engine.Serializers.Yaml</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\Engine\Engine.csproj" />
|
||||||
|
<ProjectReference Include="..\YamlDotNet\YamlDotNet\YamlDotNet.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
83
Engine.Serializers/Engine.Serializers.Yaml/YamlSerializer.cs
Normal file
83
Engine.Serializers/Engine.Serializers.Yaml/YamlSerializer.cs
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
using Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
|
using YamlDotNet.Serialization;
|
||||||
|
using YamlDotNet.Serialization.NamingConventions;
|
||||||
|
|
||||||
|
namespace Syntriax.Engine.Serializers.Yaml;
|
||||||
|
|
||||||
|
public class YamlSerializer : Core.Serialization.ISerializer
|
||||||
|
{
|
||||||
|
private readonly YamlDotNet.Serialization.ISerializer serializer = null!;
|
||||||
|
private readonly YamlDotNet.Serialization.IDeserializer deserializer = null!;
|
||||||
|
|
||||||
|
private readonly EntityRegistry entityRegistry = null!;
|
||||||
|
|
||||||
|
public YamlSerializer()
|
||||||
|
{
|
||||||
|
entityRegistry = new();
|
||||||
|
|
||||||
|
SerializerBuilder serializerBuilder = new SerializerBuilder()
|
||||||
|
.WithNamingConvention(PascalCaseNamingConvention.Instance)
|
||||||
|
.DisableAliases();
|
||||||
|
|
||||||
|
DeserializerBuilder deserializerBuilder = new DeserializerBuilder()
|
||||||
|
.WithNamingConvention(PascalCaseNamingConvention.Instance);
|
||||||
|
|
||||||
|
foreach (IEngineTypeYamlConverter typeConverter in GetEngineYamlTypeConverters())
|
||||||
|
{
|
||||||
|
typeConverter.Serializer = this;
|
||||||
|
typeConverter.EntityRegistry = entityRegistry;
|
||||||
|
|
||||||
|
deserializerBuilder = deserializerBuilder.WithTypeConverter(typeConverter);
|
||||||
|
serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter);
|
||||||
|
}
|
||||||
|
|
||||||
|
serializer = serializerBuilder.Build();
|
||||||
|
deserializer = deserializerBuilder.Build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<IEngineTypeYamlConverter> GetEngineYamlTypeConverters()
|
||||||
|
{
|
||||||
|
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes().Where(t => typeof(IEngineTypeYamlConverter).IsAssignableFrom(t) && t.IsClass && !t.IsAbstract))
|
||||||
|
yield return (Activator.CreateInstance(type) as IEngineTypeYamlConverter)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Serialize(object instance)
|
||||||
|
{
|
||||||
|
return serializer.Serialize(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public object Deserialize(string yaml)
|
||||||
|
{
|
||||||
|
entityRegistry.Reset();
|
||||||
|
object result = deserializer.Deserialize(yaml)!;
|
||||||
|
entityRegistry.AssignAll();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object Deserialize(string yaml, Type type)
|
||||||
|
{
|
||||||
|
entityRegistry.Reset();
|
||||||
|
object result = deserializer.Deserialize(yaml, type)!;
|
||||||
|
entityRegistry.AssignAll();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T Deserialize<T>(string yaml)
|
||||||
|
{
|
||||||
|
entityRegistry.Reset();
|
||||||
|
T result = deserializer.Deserialize<T>(yaml);
|
||||||
|
entityRegistry.AssignAll();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal object InternalDeserialize(string yaml, Type type)
|
||||||
|
{
|
||||||
|
return deserializer.Deserialize(yaml, type)!;
|
||||||
|
}
|
||||||
|
}
|
22
Engine.sln
22
Engine.sln
@ -11,7 +11,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Engine.Systems", "Engine.Sy
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Engine", "Engine\Engine.csproj", "{58AE79C1-9203-44AE-8022-AA180F0A71DC}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Engine", "Engine\Engine.csproj", "{58AE79C1-9203-44AE-8022-AA180F0A71DC}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YamlDotNet", "YamlDotNet\YamlDotNet\YamlDotNet.csproj", "{4C4906EB-0210-493E-A7D0-7DEBDF2969E8}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Engine.Serializers", "Engine.Serializers", "{F88E129A-9A47-4D27-96EE-6EC02F79594B}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Engine.Serializers.Yaml", "Engine.Serializers\Engine.Serializers.Yaml\Engine.Serializers.Yaml.csproj", "{E9D1CDC3-5BFF-4C87-AFEB-6CE372709176}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YamlDotNet", "Engine.Serializers\YamlDotNet\YamlDotNet\YamlDotNet.csproj", "{3D852C92-BC14-4893-AEF2-50612DAFCD8F}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@ -35,12 +39,20 @@ Global
|
|||||||
{58AE79C1-9203-44AE-8022-AA180F0A71DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{58AE79C1-9203-44AE-8022-AA180F0A71DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{58AE79C1-9203-44AE-8022-AA180F0A71DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{58AE79C1-9203-44AE-8022-AA180F0A71DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{58AE79C1-9203-44AE-8022-AA180F0A71DC}.Release|Any CPU.Build.0 = Release|Any CPU
|
{58AE79C1-9203-44AE-8022-AA180F0A71DC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{4C4906EB-0210-493E-A7D0-7DEBDF2969E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{E9D1CDC3-5BFF-4C87-AFEB-6CE372709176}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{4C4906EB-0210-493E-A7D0-7DEBDF2969E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{E9D1CDC3-5BFF-4C87-AFEB-6CE372709176}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{4C4906EB-0210-493E-A7D0-7DEBDF2969E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{E9D1CDC3-5BFF-4C87-AFEB-6CE372709176}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{4C4906EB-0210-493E-A7D0-7DEBDF2969E8}.Release|Any CPU.Build.0 = Release|Any CPU
|
{E9D1CDC3-5BFF-4C87-AFEB-6CE372709176}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{3D852C92-BC14-4893-AEF2-50612DAFCD8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{3D852C92-BC14-4893-AEF2-50612DAFCD8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{3D852C92-BC14-4893-AEF2-50612DAFCD8F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{3D852C92-BC14-4893-AEF2-50612DAFCD8F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
GlobalSection(NestedProjects) = preSolution
|
||||||
|
{E9D1CDC3-5BFF-4C87-AFEB-6CE372709176} = {F88E129A-9A47-4D27-96EE-6EC02F79594B}
|
||||||
|
{3D852C92-BC14-4893-AEF2-50612DAFCD8F} = {F88E129A-9A47-4D27-96EE-6EC02F79594B}
|
||||||
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
Loading…
x
Reference in New Issue
Block a user