Skip to content

Commit 41501b4

Browse files
Erik Bylundkirre-bylund
authored andcommitted
Add support for conditional serialization to ZeroDepJson
1 parent e6131c5 commit 41501b4

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

Runtime/Game/LootLockerObfuscator.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
using LLlibs.ZeroDepJson;
21
using System;
32
using System.Collections.Generic;
43
using System.Text;
4+
#if LOOTLOCKER_USE_NEWTONSOFTJSON
5+
using Newtonsoft.Json;
6+
using Newtonsoft.Json.Linq;
7+
#else
8+
using LLlibs.ZeroDepJson;
9+
#endif
510

611
namespace LootLocker
712
{

Runtime/Libraries/ZeroDepJson/ZeroDepJson.cs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,33 @@ private static bool TryGetObjectDefaultValue(PropertyDescriptor pd, out object v
536536
return false;
537537
}
538538

539+
private static bool TryGetObjectConditionalSerialization(Type type, MemberDefinition memberDefinition, out MethodInfo conditionalSerializationMethodInfo)
540+
{
541+
conditionalSerializationMethodInfo = null;
542+
List<string> potentialConditionalSerializationMethodNames = new List<string>
543+
{
544+
"ShouldSerialize" + memberDefinition.EscapedWireName,
545+
"ShouldSerialize" + memberDefinition.WireName,
546+
"ShouldSerialize" + memberDefinition.Name
547+
};
548+
foreach (string methodName in potentialConditionalSerializationMethodNames)
549+
{
550+
try
551+
{
552+
MethodInfo methodInfo = type.GetMethod(methodName);
553+
if (methodInfo != null && methodInfo.ReturnType == typeof(bool) && methodInfo.GetParameters().Length == 0)
554+
{
555+
conditionalSerializationMethodInfo = methodInfo;
556+
break;
557+
}
558+
}
559+
catch (AmbiguousMatchException) { }
560+
catch (ArgumentNullException) { }
561+
}
562+
563+
return conditionalSerializationMethodInfo != null;
564+
}
565+
539566
private static string GetObjectName(PropertyDescriptor pd, string defaultName)
540567
{
541568
foreach (var att in pd.Attributes.Cast<Attribute>())
@@ -1649,6 +1676,22 @@ public virtual string EscapedWireName
16491676
/// </value>
16501677
public virtual object DefaultValue { get; set; }
16511678

1679+
/// <summary>
1680+
/// Gets or sets a value indicating whether this instance has conditional serialization.
1681+
/// </summary>
1682+
/// <value>
1683+
/// <c>true</c> if this instance has conditional serialization; otherwise, <c>false</c>.
1684+
/// </value>
1685+
public virtual bool HasConditionalSerialization { get; set; }
1686+
1687+
/// <summary>
1688+
/// Gets or sets conditional serialization method info
1689+
/// </summary>
1690+
/// <value>
1691+
/// The info of the method on the type that tells whether this property should be serialized
1692+
/// </value>
1693+
public virtual MethodInfo ConditionalSerializationMethod { get; set; }
1694+
16521695
/// <summary>
16531696
/// Gets or sets the accessor.
16541697
/// </summary>
@@ -3208,6 +3251,14 @@ public void WriteValues(TextWriter writer, object component, IDictionary<object,
32083251
continue;
32093252
}
32103253

3254+
if (member.HasConditionalSerialization && member.ConditionalSerializationMethod != null)
3255+
{
3256+
if (!(bool)member.ConditionalSerializationMethod.Invoke(component, new object[] { }))
3257+
{
3258+
continue;
3259+
}
3260+
}
3261+
32113262
if (!first)
32123263
{
32133264
writer.Write(',');
@@ -3400,6 +3451,8 @@ private static IEnumerable<MemberDefinition> EnumerateDefinitionsUsingReflection
34003451

34013452
ma.HasDefaultValue = TryGetObjectDefaultValue(info, out var defaultValue);
34023453
ma.DefaultValue = defaultValue;
3454+
ma.HasConditionalSerialization = TryGetObjectConditionalSerialization(type, ma, out MethodInfo conditionalSerializationMethodInfo);
3455+
ma.ConditionalSerializationMethod = conditionalSerializationMethodInfo;
34033456
ma.Accessor = (IMemberAccessor)Activator.CreateInstance(typeof(PropertyInfoAccessor<,>).MakeGenericType(info.DeclaringType, info.PropertyType), info);
34043457
yield return ma;
34053458
}
@@ -3452,6 +3505,8 @@ private static IEnumerable<MemberDefinition> EnumerateDefinitionsUsingReflection
34523505

34533506
ma.HasDefaultValue = TryGetObjectDefaultValue(info, out var defaultValue);
34543507
ma.DefaultValue = defaultValue;
3508+
ma.HasConditionalSerialization = TryGetObjectConditionalSerialization(type, ma, out MethodInfo conditionalSerializationMethodInfo);
3509+
ma.ConditionalSerializationMethod = conditionalSerializationMethodInfo;
34553510
ma.Accessor = (IMemberAccessor)Activator.CreateInstance(typeof(FieldInfoAccessor), info);
34563511
yield return ma;
34573512
}
@@ -3509,6 +3564,8 @@ private static IEnumerable<MemberDefinition> EnumerateDefinitionsUsingTypeDescri
35093564

35103565
ma.HasDefaultValue = TryGetObjectDefaultValue(descriptor, out var defaultValue);
35113566
ma.DefaultValue = defaultValue;
3567+
ma.HasConditionalSerialization = TryGetObjectConditionalSerialization(type, ma, out MethodInfo conditionalSerializationMethodInfo);
3568+
ma.ConditionalSerializationMethod = conditionalSerializationMethodInfo;
35123569
ma.Accessor = (IMemberAccessor)Activator.CreateInstance(typeof(PropertyDescriptorAccessor), descriptor);
35133570
yield return ma;
35143571
}

0 commit comments

Comments
 (0)