Skip to content

Commit f380f8f

Browse files
committed
Improved deserialization speed
1 parent 765816a commit f380f8f

17 files changed

Lines changed: 396 additions & 233 deletions

src/AssetStudio.Extended.MonoBehaviours/AssetStudio.Extended.MonoBehaviours.csproj

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,18 @@
5252
<Compile Include="Properties\AssemblyInfo.cs" />
5353
<Compile Include="Serialization\CustomType.cs" />
5454
<Compile Include="Serialization\DefaultConverters\ByteToBooleanConverter.cs" />
55-
<Compile Include="Serialization\Managing\MemberSetter.cs" />
56-
<Compile Include="Serialization\Managing\SerializingHelper.cs" />
57-
<Compile Include="Serialization\Managing\TypedSerializerBase.cs" />
58-
<Compile Include="Serialization\Managing\SerializerManager.cs" />
59-
<Compile Include="Serialization\Managing\TypedSerializerBase.Setters.cs" />
55+
<Compile Include="Serialization\Serializers\ISerializationContext.cs" />
56+
<Compile Include="Serialization\Serializers\ITypedSerializer.cs" />
57+
<Compile Include="Serialization\Serializers\SerializationContextCreator.cs" />
58+
<Compile Include="Serialization\Serializers\SerializationContextBase.cs" />
59+
<Compile Include="Serialization\Serializers\Static\ConstructorManager.cs" />
60+
<Compile Include="Serialization\Serializers\Static\MemberSetter.cs" />
61+
<Compile Include="Serialization\Serializers\Static\StaticSerializationContext.cs" />
62+
<Compile Include="Serialization\Serializers\Static\TypedSerializerManager.cs" />
63+
<Compile Include="Serialization\Serializers\Static\TypeConverterManager.cs" />
64+
<Compile Include="Serialization\Serializers\Static\TypedSerializer.cs" />
65+
<Compile Include="Serialization\Serializers\Static\TypedSerializer.Setters.cs" />
66+
<Compile Include="Serialization\Serializers\TypedSerializerBase.cs" />
6067
<Compile Include="Serialization\RawData.cs" />
6168
<Compile Include="Serialization\ScriptableObjectAttribute.cs" />
6269
<Compile Include="Serialization\ScriptableObjectIgnoreAttribute.cs" />
@@ -65,6 +72,7 @@
6572
<Compile Include="Serialization\Naming\CamelCaseNamingConvention.cs" />
6673
<Compile Include="Serialization\Naming\INamingConvention.cs" />
6774
<Compile Include="Serialization\PopulationStrategy.cs" />
75+
<Compile Include="Serialization\SerializingHelper.cs" />
6876
<Compile Include="Serialization\StructureReader.cs" />
6977
</ItemGroup>
7078
<ItemGroup>

src/AssetStudio.Extended.MonoBehaviours/Serialization/CustomType.cs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,47 +5,54 @@
55
using JetBrains.Annotations;
66

77
namespace AssetStudio.Extended.MonoBehaviours.Serialization {
8-
internal sealed class CustomType : IReadOnlyDictionary<string, object> {
8+
public sealed class CustomType : IReadOnlyDictionary<string, object> {
99

10-
public CustomType([NotNull] string typeName, [NotNull] Dictionary<string, object> variables) {
10+
internal CustomType([NotNull] string typeName, [NotNull] Dictionary<string, object> variables) {
1111
TypeName = typeName;
12-
Variables = variables;
12+
MutableVariables = variables;
1313
}
1414

1515
[NotNull]
1616
public string TypeName { get; }
1717

18+
[NotNull]
19+
public IReadOnlyDictionary<string, object> Variables {
20+
[DebuggerStepThrough]
21+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
22+
get => MutableVariables;
23+
}
24+
1825
// Should keep immutable
1926
[NotNull]
20-
public Dictionary<string, object> Variables {
27+
internal Dictionary<string, object> MutableVariables {
2128
[DebuggerStepThrough]
2229
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2330
get;
2431
}
2532

2633
IEnumerator<KeyValuePair<string, object>> IEnumerable<KeyValuePair<string, object>>.GetEnumerator() {
27-
return Variables.GetEnumerator();
34+
return MutableVariables.GetEnumerator();
2835
}
2936

3037
IEnumerator IEnumerable.GetEnumerator() {
31-
return ((IEnumerable)Variables).GetEnumerator();
38+
return ((IEnumerable)MutableVariables).GetEnumerator();
3239
}
3340

34-
int IReadOnlyCollection<KeyValuePair<string, object>>.Count => Variables.Count;
41+
int IReadOnlyCollection<KeyValuePair<string, object>>.Count => MutableVariables.Count;
3542

3643
bool IReadOnlyDictionary<string, object>.ContainsKey([NotNull] string key) {
37-
return Variables.ContainsKey(key);
44+
return MutableVariables.ContainsKey(key);
3845
}
3946

4047
bool IReadOnlyDictionary<string, object>.TryGetValue(string key, out object value) {
41-
return Variables.TryGetValue(key, out value);
48+
return MutableVariables.TryGetValue(key, out value);
4249
}
4350

44-
object IReadOnlyDictionary<string, object>.this[string key] => Variables[key];
51+
object IReadOnlyDictionary<string, object>.this[string key] => MutableVariables[key];
4552

46-
IEnumerable<string> IReadOnlyDictionary<string, object>.Keys => Variables.Keys;
53+
IEnumerable<string> IReadOnlyDictionary<string, object>.Keys => MutableVariables.Keys;
4754

48-
IEnumerable<object> IReadOnlyDictionary<string, object>.Values => Variables.Values;
55+
IEnumerable<object> IReadOnlyDictionary<string, object>.Values => MutableVariables.Values;
4956

5057
}
5158
}

src/AssetStudio.Extended.MonoBehaviours/Serialization/Managing/SerializerManager.cs

Lines changed: 0 additions & 174 deletions
This file was deleted.

src/AssetStudio.Extended.MonoBehaviours/Serialization/ScriptableObjectSerializer.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
using System;
22
using System.Diagnostics;
33
using AssetStudio.Extended.MonoBehaviours.Serialization.DefaultConverters;
4-
using AssetStudio.Extended.MonoBehaviours.Serialization.Managing;
4+
using AssetStudio.Extended.MonoBehaviours.Serialization.Serializers;
55
using JetBrains.Annotations;
66

77
namespace AssetStudio.Extended.MonoBehaviours.Serialization {
88
public sealed class ScriptableObjectSerializer {
99

1010
public ScriptableObjectSerializer() {
11-
_manager = new SerializerManager();
11+
_context = new Lazy<ISerializationContext>(SerializationContextCreator.CreateStatic);
1212

1313
// In old versions(?) Unity serializes booleans as bytes
1414
WithConverter<ByteToBooleanConverter>();
@@ -17,19 +17,18 @@ public ScriptableObjectSerializer() {
1717
[NotNull]
1818
public ScriptableObjectSerializer WithConverter<T>()
1919
where T : ISimpleTypeConverter {
20-
_manager.RegisterConverter<T>();
21-
return this;
20+
return WithConverter(typeof(T));
2221
}
2322

2423
[NotNull]
2524
public ScriptableObjectSerializer WithConverter([NotNull] Type converterType) {
26-
_manager.RegisterConverter(converterType);
25+
_context.Value.RegisterConverter(converterType);
2726
return this;
2827
}
2928

3029
[NotNull]
3130
public ScriptableObjectSerializer WithConverter([NotNull] ISimpleTypeConverter converter) {
32-
_manager.RegisterConverter(converter);
31+
_context.Value.RegisterConverter(converter);
3332
return this;
3433
}
3534

@@ -62,15 +61,15 @@ public object Deserialize([NotNull] MonoBehaviour monoBehavior, [NotNull] Type t
6261
Debug.Assert(rootObject != null);
6362
Debug.Assert(rootObject is CustomType);
6463

65-
var serializer = _manager.GetSerializerOf(type);
64+
var serializer = _context.Value.GetSerializerOf(type);
6665

67-
var obj = serializer.DeserializeObject((CustomType)rootObject);
66+
var obj = serializer.DeserializeObject((CustomType)rootObject, 0);
6867

6968
return obj;
7069
}
7170

7271
[NotNull]
73-
private readonly SerializerManager _manager;
72+
private readonly Lazy<ISerializationContext> _context;
7473

7574
}
7675
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System;
2+
using JetBrains.Annotations;
3+
4+
namespace AssetStudio.Extended.MonoBehaviours.Serialization.Serializers {
5+
public interface ISerializationContext {
6+
7+
void RegisterConverter([NotNull] ISimpleTypeConverter converter);
8+
9+
void RegisterConverter([NotNull] Type converterType);
10+
11+
[NotNull]
12+
ITypedSerializer GetSerializerOf([NotNull] Type type);
13+
14+
}
15+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using JetBrains.Annotations;
2+
3+
namespace AssetStudio.Extended.MonoBehaviours.Serialization.Serializers {
4+
public interface ITypedSerializer {
5+
6+
/// <summary>
7+
/// Deserialize a typed complex object.
8+
/// </summary>
9+
/// <param name="structure">Object value structure.</param>
10+
/// <param name="level">Current value level from the root. Root level is 0, which includes ScriptableObject's internal fields, and other user defined fields. Fields of the root fields is at level 1, etc.</param>
11+
/// <returns>Deserialized object instance.</returns>
12+
[NotNull]
13+
object DeserializeObject([NotNull] CustomType structure, int level);
14+
15+
}
16+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System;
2+
3+
namespace AssetStudio.Extended.MonoBehaviours.Serialization.Serializers {
4+
public abstract class SerializationContextBase : ISerializationContext {
5+
6+
public abstract void RegisterConverter(ISimpleTypeConverter converter);
7+
8+
public abstract void RegisterConverter(Type converterType);
9+
10+
public void RegisterConverter<T>()
11+
where T : ISimpleTypeConverter {
12+
RegisterConverter(typeof(T));
13+
}
14+
15+
public abstract ITypedSerializer GetSerializerOf(Type type);
16+
17+
}
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using AssetStudio.Extended.MonoBehaviours.Serialization.Serializers.Static;
2+
using JetBrains.Annotations;
3+
4+
namespace AssetStudio.Extended.MonoBehaviours.Serialization.Serializers {
5+
internal static class SerializationContextCreator {
6+
7+
[NotNull]
8+
public static ISerializationContext CreateStatic() {
9+
return new StaticSerializationContext();
10+
}
11+
12+
}
13+
}

0 commit comments

Comments
 (0)