Skip to content

Commit

Permalink
Added RuntimeUtils.GetSerializableFields(object)
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelsakharov committed Apr 4, 2024
1 parent e21de56 commit fae2498
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 23 deletions.
3 changes: 1 addition & 2 deletions Prowl.Editor/Editor/CustomEditors/GameObjectEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,7 @@ public override void OnInspectorGUI()
}
}

FieldInfo[] fields = cType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
foreach (var field in fields.Where(field => field.IsPublic || Attribute.IsDefined(field, typeof(SerializeFieldAttribute))))
foreach (var field in RuntimeUtils.GetSerializableFields(comp))
if (PropertyDrawer.Draw(comp, field))
comp.OnValidate();

Expand Down
10 changes: 1 addition & 9 deletions Prowl.Editor/Editor/CustomEditors/ScriptableObjectEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,8 @@ public override void OnInspectorGUI()

ScriptableObject scriptObject = Serializer.Deserialize<ScriptableObject>(StringTagConverter.ReadFromFile((target as MetaFile).AssetPath));

FieldInfo[] fields = scriptObject.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

// Private fields need to have the SerializeField attribute
fields = fields.Where(field => field.IsPublic || Attribute.IsDefined(field, typeof(SerializeFieldAttribute))).ToArray();

foreach (var field in fields)
{
// Draw the field using PropertyDrawer.Draw
foreach (var field in RuntimeUtils.GetSerializableFields(scriptObject))
changed |= PropertyDrawer.Draw(scriptObject, field);
}

// Draw any Buttons
changed |= EditorGui.HandleAttributeButtons(scriptObject);
Expand Down
15 changes: 3 additions & 12 deletions Prowl.Runtime/Serializer/Serializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -201,12 +201,8 @@ private static SerializedProperty SerializeObject(object? value, SerializationCo
}
else
{
// Automatic Serializer
var properties = GetAllFields(type).Where(field => (field.IsPublic || field.GetCustomAttribute<SerializeFieldAttribute>() != null) && field.GetCustomAttribute<SerializeIgnoreAttribute>() == null);
// If public and has System.NonSerializedAttribute then ignore
properties = properties.Where(field => !field.IsPublic || field.GetCustomAttribute<NonSerializedAttribute>() == null);

foreach (var field in properties)
// Auto Serialization
foreach (var field in RuntimeUtils.GetSerializableFields(value))
{
string name = field.Name;

Expand Down Expand Up @@ -351,12 +347,7 @@ private static object DeserializeInto(SerializedProperty tag, object into, Seria
}
else
{
FieldInfo[] fields = GetAllFields(into.GetType()).ToArray();

var properties = fields.Where(field => (field.IsPublic || field.GetCustomAttribute<SerializeFieldAttribute>() != null) && field.GetCustomAttribute<SerializeIgnoreAttribute>() == null);
// If public and has System.NonSerializedAttribute then ignore
properties = properties.Where(field => !field.IsPublic || field.GetCustomAttribute<NonSerializedAttribute>() == null);
foreach (var field in properties)
foreach (var field in RuntimeUtils.GetSerializableFields(into))
{
string name = field.Name;

Expand Down
10 changes: 10 additions & 0 deletions Prowl.Runtime/Utils/RuntimeUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@ public static Type FindType(string qualifiedTypeName)
}
}

public static FieldInfo[] GetSerializableFields(object target)
{
FieldInfo[] fields = target.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
// Only allow Publics or ones with SerializeField
fields = fields.Where(field => field.IsPublic || Attribute.IsDefined(field, typeof(SerializeFieldAttribute))).ToArray();
// Remove Public NonSerialized fields
fields = fields.Where(field => !field.IsPublic || field.GetCustomAttribute<NonSerializedAttribute>() == null).ToArray();
return fields;
}

public static object? GetValue(this MemberInfo member, object? target)
{
if (member is PropertyInfo prop)
Expand Down

0 comments on commit fae2498

Please sign in to comment.