- edited description
Abstract classes not serialized correctly on AOT Build
Issue #719
new
Unity version: 2020.1.7f1
Odin: 3.0.1.0
Windows 10.
I’m using SerializationUtility.SerializeValue to save the state of an object so i can retrieve it later, it does work fine in editor, but does not work in IL2CPP builds.
Relevant bits of code:
SerializableEntity.cs
public class SerializableEntity : MonoBehaviour { Dictionary<string, EntityParameter> _parametersDict = new Dictionary<string, EntityParameter>(); public virtual byte[] SerializeParameters() { Assert.IsNotNull(_parametersDict); var paremters = _parametersDict.Values.ToArray(); var serialized = SerializationUtility.SerializeValue<EntityParameter[]>(paremters, DataFormat.JSON); Debug.Log("Serialize " + name + " " + paremters.Length); foreach (var item in paremters) { Debug.Log(item.Name); } Debug.Log(System.Text.Encoding.UTF8.GetString(serialized)); return serialized; } }
EntityParemeter.cs
[Serializable] public abstract class EntityParameter { public event Action OnChanged; public EntityParameter() { } protected void FireOnChanged() { OnChanged?.Invoke(); } [SerializeField] private string _name; public string Name { get => _name; } [SerializeField] private string _label = string.Empty; public string Label { get => _label != string.Empty ? _label : _name; } public abstract object Value { get; set; } public EntityParameter(string name, string label = null) { _name = name; _label = label ?? string.Empty; } }
BoolParameter.cs
[Serializable] public class BoolParameter : EntityParameter { [SerializeField] private bool _value; public override object Value { get => _value; set { if (value.GetType() != typeof(bool)) return; if (value.Equals(_value)) return; _value = (bool)value; FireOnChanged(); } } public BoolParameter(string name, bool value, string label = null) : base(name, label) { _value = value; } }
AOTPreprocessor.cs
public class AOTPreprocessor : IPreprocessBuildWithReport { public int callbackOrder => 0; public void OnPreprocessBuild(BuildReport report) { List<System.Type> supportedTypes; if (AOTSupportUtilities.ScanProjectForSerializedTypes(out supportedTypes)) { supportedTypes.Add(typeof(ParameterList)); supportedTypes.Add(typeof(EntityParameter)); supportedTypes.Add(typeof(BoolParameter)); supportedTypes.Add(typeof(AngleParameter)); supportedTypes.Add(typeof(IntParameter)); supportedTypes.Add(typeof(Vector2Parameter)); supportedTypes.Add(typeof(ListParameter)); supportedTypes.Add(typeof(EntityParameter[])); supportedTypes.Add(typeof(int)); supportedTypes.Add(typeof(float)); supportedTypes.Add(typeof(string)); supportedTypes.Add(typeof(bool)); supportedTypes.Add(typeof(Vector2)); supportedTypes.Add(typeof(Vector3)); AOTSupportUtilities.GenerateDLL(Application.dataPath + "/Plugins/", "GeneratedAOT", supportedTypes); Debug.Log("generate AOT"); Debug.Log(Application.dataPath + "/Plugins/"); } } }
I serialized to JSON so i can see what is happening and in the editor the log is this:
Serialize TerroristEditor(Clone) 1 _isFacingRight { "$id": 0, "$type": "0|MRChip.LevelManager.EntityParameter[], Plugins", "$rlength": 1, "$rcontent": [{"$id": 1,"$type": "1|MRChip.LevelManager.BoolParameter, Plugins","_name": "_isFacingRight","_label": "Is Facing Right","_value": true}] }
The exact same scene, with the exact same object in the IL2CPP build, the result is this:
Serialize TerroristEditor(Clone) 1 _isFacingRight { "$id": 0, "$type": "0|MRChip.LevelManager.EntityParameter[], Plugins" }
The parameter ( “_isFacingRight”) is in the object, but it is not present on the serialization.
Comments (1)
-
reporter - Log in to comment