Skip to content

Commit 9060f8b

Browse files
[Serialization] WIP on new Serializer;
1 parent 1622dc3 commit 9060f8b

File tree

7 files changed

+344
-65
lines changed

7 files changed

+344
-65
lines changed

Engine/Core/MessagePackGenerated/MessagePackGenerated.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3595,7 +3595,7 @@ public void Serialize(ref global::MessagePack.MessagePackWriter writer, global::
35953595
global::MessagePack.IFormatterResolver formatterResolver = options.Resolver;
35963596
writer.WriteArrayHeader(2);
35973597
formatterResolver.GetFormatterWithVerify<string>().Serialize(ref writer, value.typeName, options);
3598-
formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<string, global::Staple.Internal.SerializableStapleAssetParameter>>().Serialize(ref writer, value.parameters, options);
3598+
formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<string, global::Staple.Internal.SerializableStapleAssetParameter>>().Serialize(ref writer, value.fields, options);
35993599
}
36003600

36013601
public global::Staple.Internal.SerializableStapleAssetContainer Deserialize(ref global::MessagePack.MessagePackReader reader, global::MessagePack.MessagePackSerializerOptions options)
@@ -3618,7 +3618,7 @@ public void Serialize(ref global::MessagePack.MessagePackWriter writer, global::
36183618
____result.typeName = formatterResolver.GetFormatterWithVerify<string>().Deserialize(ref reader, options);
36193619
break;
36203620
case 1:
3621-
____result.parameters = formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<string, global::Staple.Internal.SerializableStapleAssetParameter>>().Deserialize(ref reader, options);
3621+
____result.fields = formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<string, global::Staple.Internal.SerializableStapleAssetParameter>>().Deserialize(ref reader, options);
36223622
break;
36233623
default:
36243624
reader.Skip();

Engine/Core/Scene/Scene.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ internal static Entity Instantiate(SceneObject sceneObject, out int localID, boo
140140
continue;
141141
}
142142

143+
entity.AddComponent(type);
144+
143145
entity.SetComponent(componentInstance);
144146
}
145147

Engine/Core/Serialization/Asset/SerializableStapleAsset.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public class SerializableStapleAssetContainer
4848
public string typeName;
4949

5050
[Key(1)]
51-
public Dictionary<string, SerializableStapleAssetParameter> parameters = [];
51+
public Dictionary<string, SerializableStapleAssetParameter> fields = [];
5252

5353
internal StapleSerializerContainer ToSerializerContainer()
5454
{
@@ -57,7 +57,7 @@ internal StapleSerializerContainer ToSerializerContainer()
5757
typeName = typeName,
5858
};
5959

60-
foreach(var pair in parameters)
60+
foreach(var pair in fields)
6161
{
6262
outValue.fields.Add(pair.Key, pair.Value.ToSerializerField());
6363
}

Engine/Core/Serialization/Serializer/StapleSerializer.cs

Lines changed: 257 additions & 50 deletions
Large diffs are not rendered by default.

Engine/Core/Serialization/Serializer/StapleSerializerContainer.cs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Text.Json.Serialization;
23

34
namespace Staple.Internal;
45

@@ -16,9 +17,33 @@ public SerializableStapleAssetContainer ToSerializableContainer()
1617

1718
foreach(var pair in fields)
1819
{
19-
outValue.parameters.Add(pair.Key, pair.Value.ToSerializableParameter());
20+
outValue.fields.Add(pair.Key, pair.Value.ToSerializableParameter());
2021
}
2122

2223
return outValue;
2324
}
2425
}
26+
27+
[JsonSourceGenerationOptions(IncludeFields = true)]
28+
[JsonSerializable(typeof(List<int>))]
29+
[JsonSerializable(typeof(List<string>))]
30+
[JsonSerializable(typeof(StapleSerializerContainer))]
31+
[JsonSerializable(typeof(Dictionary<string, StapleSerializerField>))]
32+
[JsonSerializable(typeof(StapleSerializerField))]
33+
[JsonSerializable(typeof(bool))]
34+
[JsonSerializable(typeof(string))]
35+
[JsonSerializable(typeof(byte))]
36+
[JsonSerializable(typeof(sbyte))]
37+
[JsonSerializable(typeof(char))]
38+
[JsonSerializable(typeof(ushort))]
39+
[JsonSerializable(typeof(short))]
40+
[JsonSerializable(typeof(uint))]
41+
[JsonSerializable(typeof(int))]
42+
[JsonSerializable(typeof(ulong))]
43+
[JsonSerializable(typeof(long))]
44+
[JsonSerializable(typeof(float))]
45+
[JsonSerializable(typeof(double))]
46+
internal partial class StapleSerializerContainerSerializationContext : JsonSerializerContext
47+
{
48+
}
49+

Engine/Core/World/World+Components.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,8 @@ public bool TryGetComponent<T>(Entity entity, out T component) where T: ICompone
419419
/// <param name="component">The component instance to replace</param>
420420
public void SetComponent(Entity entity, IComponent component)
421421
{
422-
if (TryGetEntity(entity, out var entityInfo) == false)
422+
if (TryGetEntity(entity, out var entityInfo) == false ||
423+
component is null)
423424
{
424425
return;
425426
}

Engine/StapleCoreTests/Assets/AssetSerializationTests.cs

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Staple;
22
using Staple.Internal;
3+
using System.Text.Json;
34

45
namespace CoreTests
56
{
@@ -160,7 +161,7 @@ public void TestSerialize()
160161
Assert.That(result.parameters[nameof(SimpleAsset.stringValue)].value, Is.EqualTo(asset.stringValue));
161162
Assert.That(result.parameters[nameof(SimpleAsset.numbers)].value, Is.EqualTo(asset.numbers));
162163
Assert.That(result.parameters[nameof(SimpleAsset.pathAsset)].value, Is.EqualTo(asset.pathAsset.Guid));
163-
Assert.That(result.parameters[nameof(SimpleAsset.enumValue)].value, Is.EqualTo(asset.enumValue));
164+
Assert.That(result.parameters[nameof(SimpleAsset.enumValue)].value, Is.EqualTo(asset.enumValue.ToString()));
164165
});
165166

166167
asset.pathAsset = (SimplePathAsset)SimplePathAsset.Create("/abc/Cache/Staging/Windows/valid path");
@@ -243,7 +244,7 @@ public void TestSerializeSerializable()
243244
if (parameter.value is SerializableStapleAssetContainer container)
244245
{
245246
Assert.That(container.typeName, Is.EqualTo(typeof(SerializableAsset.InnerClass).FullName));
246-
Assert.That(container.parameters, Has.Count.EqualTo(0));
247+
Assert.That(container.fields, Has.Count.EqualTo(0));
247248
}
248249
}
249250
});
@@ -265,21 +266,21 @@ public void TestSerializeSerializable()
265266
if (parameter.value is SerializableStapleAssetContainer container)
266267
{
267268
Assert.That(container.typeName, Is.EqualTo(typeof(SerializableAsset.InnerClass).FullName));
268-
Assert.That(container.parameters, Has.Count.EqualTo(1));
269+
Assert.That(container.fields, Has.Count.EqualTo(1));
269270

270-
Assert.That(container.parameters.ContainsKey(nameof(SerializableAsset.InnerClass.container)), Is.True);
271+
Assert.That(container.fields.ContainsKey(nameof(SerializableAsset.InnerClass.container)), Is.True);
271272

272-
Assert.That(container.parameters[nameof(SerializableAsset.InnerClass.container)].value, Is.TypeOf<SerializableStapleAssetContainer>());
273+
Assert.That(container.fields[nameof(SerializableAsset.InnerClass.container)].value, Is.TypeOf<SerializableStapleAssetContainer>());
273274

274-
if (container.parameters[nameof(SerializableAsset.InnerClass.container)].value is SerializableStapleAssetContainer innerContainer)
275+
if (container.fields[nameof(SerializableAsset.InnerClass.container)].value is SerializableStapleAssetContainer innerContainer)
275276
{
276277
Assert.That(innerContainer.typeName, Is.EqualTo(typeof(SerializableAsset.InnerClass.InnerInnerClass).FullName));
277278

278-
Assert.That(innerContainer.parameters.Count, Is.EqualTo(1));
279+
Assert.That(innerContainer.fields.Count, Is.EqualTo(1));
279280

280-
Assert.That(innerContainer.parameters.ContainsKey(nameof(SerializableAsset.InnerClass.InnerInnerClass.value)));
281+
Assert.That(innerContainer.fields.ContainsKey(nameof(SerializableAsset.InnerClass.InnerInnerClass.value)));
281282

282-
if (innerContainer.parameters.TryGetValue(nameof(SerializableAsset.InnerClass.InnerInnerClass), out var innerParameter))
283+
if (innerContainer.fields.TryGetValue(nameof(SerializableAsset.InnerClass.InnerInnerClass), out var innerParameter))
283284
{
284285
Assert.That(innerParameter.typeName, Is.EqualTo(typeof(int).FullName));
285286

@@ -470,5 +471,48 @@ public void TestSerializeField()
470471
Assert.That(newAsset.GetSerializedField(), Is.EqualTo(2));
471472
}
472473
}
474+
475+
[Test]
476+
public void TestDeserializeJson()
477+
{
478+
StapleCodeGeneration.TypeCacheRegistration.RegisterAll();
479+
480+
var asset = new SimpleAsset
481+
{
482+
intValue = 2,
483+
stringValue = "different",
484+
enumValue = NewEnum.B,
485+
};
486+
487+
asset.numbers.Clear();
488+
asset.numbers.Add(123);
489+
490+
asset.pathAsset = (SimplePathAsset)SimplePathAsset.Create("/abc/Cache/Staging/Windows/valid path");
491+
492+
var result = StapleSerializer.SerializeContainer(asset, true);
493+
494+
Assert.That(result, Is.Not.EqualTo(null));
495+
496+
var jsonText = JsonSerializer.Serialize(result, StapleSerializerContainerSerializationContext.Default.StapleSerializerContainer);
497+
498+
var deserialized = JsonSerializer.Deserialize(jsonText, StapleSerializerContainerSerializationContext.Default.StapleSerializerContainer);
499+
500+
var newResult = StapleSerializer.DeserializeContainer(deserialized);
501+
502+
Assert.That(newResult, Is.Not.EqualTo(null));
503+
504+
Assert.That(newResult, Is.TypeOf<SimpleAsset>());
505+
506+
var newAsset = newResult as SimpleAsset;
507+
508+
Assert.That(newAsset, Is.Not.EqualTo(null));
509+
510+
Assert.That(newAsset.intValue, Is.EqualTo(asset.intValue));
511+
Assert.That(newAsset.stringValue, Is.EqualTo(asset.stringValue));
512+
Assert.That(newAsset.numbers, Is.EqualTo(asset.numbers));
513+
Assert.That(newAsset.pathAsset != null);
514+
Assert.That(newAsset.pathAsset.Guid, Is.EqualTo("valid path"));
515+
Assert.That(newAsset.enumValue, Is.EqualTo(asset.enumValue));
516+
}
473517
}
474518
}

0 commit comments

Comments
 (0)