|
@@ -119,7 +119,7 @@ namespace InABox.Core
|
|
|
/// <summary>
|
|
|
/// Observable object with INotifyPropertyChanged implemented
|
|
|
/// </summary>
|
|
|
- public abstract class BaseObject : INotifyPropertyChanged, IBaseObject, IJsonOnDeserializing, IJsonOnDeserialized
|
|
|
+ public abstract class BaseObject : INotifyPropertyChanged, IBaseObject, IJsonOnDeserializing, IJsonOnDeserialized, IJsonOnSerialized, IJsonOnSerializing
|
|
|
{
|
|
|
public BaseObject()
|
|
|
{
|
|
@@ -129,6 +129,7 @@ namespace InABox.Core
|
|
|
}
|
|
|
|
|
|
internal bool _disabledInterceptor;
|
|
|
+ private bool _deserialising;
|
|
|
|
|
|
protected T InitializeField<T>(ref T? field, [CallerMemberName] string name = "")
|
|
|
where T : BaseObject, ISubObject, new()
|
|
@@ -147,7 +148,7 @@ namespace InABox.Core
|
|
|
[GetInterceptor]
|
|
|
protected T GetValue<T>(Type propertyType, ref T field, string name)
|
|
|
{
|
|
|
- if (_disabledInterceptor) return field;
|
|
|
+ if (_disabledInterceptor || _deserialising) return field;
|
|
|
|
|
|
if(field is null && propertyType.HasInterface<ISubObject>() && !propertyType.IsAbstract)
|
|
|
{
|
|
@@ -165,19 +166,50 @@ namespace InABox.Core
|
|
|
}
|
|
|
|
|
|
[SetInterceptor]
|
|
|
- protected void SetValue<T>(ref T field, T newValue)
|
|
|
+ protected void SetValue<T>(Type propertyType, ref T field, string name, T newValue)
|
|
|
{
|
|
|
- field = newValue;
|
|
|
+ if (_disabledInterceptor || !_deserialising)
|
|
|
+ {
|
|
|
+ field = newValue;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(field is null && newValue is ISubObject subObj && !propertyType.IsAbstract)
|
|
|
+ {
|
|
|
+ subObj.SetLinkedParent(this);
|
|
|
+ subObj.SetLinkedPath(name);
|
|
|
+ if(subObj is BaseObject obj)
|
|
|
+ {
|
|
|
+ obj.SetObserving(_observing);
|
|
|
+ }
|
|
|
+ field = newValue;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ field = newValue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void OnSerializing()
|
|
|
+ {
|
|
|
+ _disabledInterceptor = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void OnSerialized()
|
|
|
+ {
|
|
|
+ _disabledInterceptor = false;
|
|
|
}
|
|
|
|
|
|
public void OnDeserializing()
|
|
|
{
|
|
|
+ _deserialising = true;
|
|
|
if (_observing)
|
|
|
SetObserving(false);
|
|
|
}
|
|
|
|
|
|
public void OnDeserialized()
|
|
|
{
|
|
|
+ _deserialising = false;
|
|
|
if (!_observing)
|
|
|
SetObserving(true);
|
|
|
}
|