- changed status to invalid
SerializedMonoBehaviour / SerializedScriptableObject nested fields are null
Issue #347
invalid
1. What happened?
Class fields are always null, even after force initialize it in the constructor. Every field inside the object of the class Subject<Unit> is null. And the class generate NullReferenceException. If don't use SerializedMonoBehaviour everything is fine.
2. How can we reproduce it?
Add UniRx and just execute this code:
using Sirenix.OdinInspector;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using System;
public class SerializedClass : SerializedMonoBehaviour
{
public readonly IObservable<Unit> onDie = new Subject<Unit>();
protected virtual void Awake()
{
((Subject<Unit>)onDie).OnNext(Unit.Default);
}
}
4. What version of Unity are you using?
2018.1.1 and 2018.1.4
5. What version of Odin are you using? (See "Tools > Odin Inspector > About")
1.0.6.9
6. Do you have Editor Only mode enabled?
No
7. What operating system are you on?
Windows 10 x64
Comments (2)
-
-
reporter I didn't know. Thank you!
- Log in to comment
When using Odin's serialization, you need to understand its serialization behaviour. Taking a look at UniRx's Subject class, I can see that it was not made to be serializable, so everything inside it will break when it is serialized/deserialized - yet you have it as a public field, and public fields are serialized by default, since Odin emulates Unity's serialization behaviour. (See this FAQ answer for more details.)
As such, this is not a bug. If you wish Odin to leave your public field alone, you must add [NonSerialized] to it, and then your initialization will not be overriden by the (faulty) serialized value.