InvalidCastException issue

Discussion and help for Easy Save 3
Post Reply
ShaunBartoo
Posts: 5
Joined: Wed May 05, 2021 11:09 pm

InvalidCastException issue

Post by ShaunBartoo »

Hi Joel,

I'm having an intermittent issue serializing a ScriptableObject. It seems to be having issues serializing an Enum in certain cases.

Here's the error I'm getting:

Code: Select all

InvalidCastException: Specified cast is not valid.
ES3Types.ES3Type_enum.Write (System.Object obj, ES3Writer writer) (at Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_enum.cs:23)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:198)
ES3Writer.WriteProperty (System.String name, System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:286)
ES3Writer.WriteProperty (System.String name, System.Object value, ES3Types.ES3Type type) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:276)
ES3Types.ES3UserType_CardData.WriteScriptableObject (System.Object obj, ES3Writer writer) (at Assets/Easy Save 3/Types/ES3UserType_CardData.cs:25)
ES3Types.ES3ScriptableObjectType.WriteUnityObject (System.Object obj, ES3Writer writer) (at Assets/Plugins/Easy Save 3/Scripts/Types/ES3ScriptableObjectType.cs:26)
ES3Types.ES3UnityObjectType.WriteObject (System.Object obj, ES3Writer writer, ES3+ReferenceMode mode) (at Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs:45)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:219)
ES3.Serialize[T] (T value, ES3Settings settings) (at Assets/Plugins/Easy Save 3/Scripts/ES3.cs:779)
ES3File.Save[T] (System.String key, T value) (at Assets/Plugins/Easy Save 3/Scripts/ES3File.cs:154)
ES3.Save[T] (System.String key, T value, ES3Settings settings) (at Assets/Plugins/Easy Save 3/Scripts/ES3.cs:100)
GameState.SaveGridObject (System.Int32 objectIndex) (at Assets/Scripts/Serialization/GameState.cs:86)
GameState.Save () (at Assets/Scripts/Serialization/GameState.cs:38)
GameStateManager+<CaptureGameStateNextUpdate>d__3.MoveNext () (at Assets/Scripts/Serialization/GameStateManager.cs:25)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <9baebf9af86541678fd15bfdbf5f26eb>:0)
Line 25 of ES3UserType_CardData (the line that is throwing the error) is this:

Code: Select all

            
            writer.WriteProperty("Targeting", instance.Targeting, ES3Type_enum.Instance);
Here is the relevant part of the ScriptableObject class that I'm serializing:

Code: Select all

using System.Collections.Generic;
using UnityEngine;
using Sirenix.OdinInspector;
using UnityEngine.AddressableAssets;

/// <summary>
/// Class should be attatched to a card. Class defines unique properties for a card. 
/// Class's inspector provides tools to create nested scriptable objects that define behavior for card
/// Class provides method for creating a Card object from CardData
/// </summary>
[InlineEditor] [CreateAssetMenu(menuName = "ScriptableObjects/CardData")]
public class CardData : NestedScriptableObject
{
    [HideIf("@UICardPrefab != null")]
    public GameObject UICardPrefab;
    public string CardName;
    public int Cost;
    public AssetReference CardImage;
    [MultiLineProperty]
    public string RulesText;
    public CardColor CardColor;
    [EnumToggleButtons]
    public enum TargetingType { targeted, self, all }
    public TargetingType Targeting;
    [NestedScriptableObjectField, BoxGroup("Targeting", VisibleIf = "@Targeting == TargetingType.targeted")]
    public GridShape Range;
    [NestedScriptableObjectField, BoxGroup("Targeting")]
    public GridShape AreaOfEffect;
    [BoxGroup("Targeting")]
    public GridTarget AITarget;
    [NestedScriptableObjectList]
    public List<CardEffect> CardEffects = new List<CardEffect>();
    
    ......
    
   
    
The issue is a little baffling for me. It only shows up on certain instances of the ScriptableObject I'm serializing. I've been able to track down the cases where it throws the exception - It seems to occur when I don't have a specific CardEffect (Another type of ScriptableObject) included in the CardEffects list (which shouldn't have anything to do with serializing the Targeting property).

Any suggestions of how I might sort out this issue would be greatly appreciated!


Edit: I've found another context that the error seems to be occoring in - serializing an image? The hideFlags enum is causing the error in this case, but it is likewise solved by adding an entirely unrelated CardEffect

Code: Select all

nvalidCastException: Specified cast is not valid.
ES3Types.ES3Type_enum.Write (System.Object obj, ES3Writer writer) (at Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_enum.cs:23)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:198)
ES3Writer.WriteProperty (System.String name, System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:286)
ES3Writer.WriteProperty (System.String name, System.Object value, ES3Types.ES3Type type) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:276)
ES3Types.ES3Type_Image.WriteComponent (System.Object obj, ES3Writer writer) (at Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Image.cs:45)
ES3Types.ES3ComponentType.WriteUnityObject (System.Object obj, ES3Writer writer) (at Assets/Plugins/Easy Save 3/Scripts/Types/ES3ComponentType.cs:31)
ES3Types.ES3UnityObjectType.WriteObject (System.Object obj, ES3Writer writer, ES3+ReferenceMode mode) (at Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs:45)
ES3Types.ES3UnityObjectType.WriteUsingDerivedType (System.Object obj, ES3Writer writer, ES3+ReferenceMode mode) (at Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs:115)
ES3Types.ES3UnityObjectType.WriteObject (System.Object obj, ES3Writer writer, ES3+ReferenceMode mode) (at Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs:28)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:219)
ES3Types.ES3ListType.Write (System.Object obj, ES3Writer writer, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs:29)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:202)
ES3Writer.Write (System.Object value, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:161)
ES3Writer.WriteProperty (System.String name, System.Object value, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:262)
ES3Types.ES3Type_GameObject.WriteObject (System.Object obj, ES3Writer writer, ES3+ReferenceMode mode) (at Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs:66)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:219)
ES3Types.ES3ListType.Write (System.Object obj, ES3Writer writer, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs:29)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:202)
ES3Writer.Write (System.Object value, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:161)
ES3Writer.WriteProperty (System.String name, System.Object value, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:262)
ES3Types.ES3Type_GameObject.WriteObject (System.Object obj, ES3Writer writer, ES3+ReferenceMode mode) (at Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs:49)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:219)
ES3Types.ES3ListType.Write (System.Object obj, ES3Writer writer, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs:29)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:202)
ES3Writer.Write (System.Object value, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:161)
ES3Writer.WriteProperty (System.String name, System.Object value, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:262)
ES3Types.ES3Type_GameObject.WriteObject (System.Object obj, ES3Writer writer, ES3+ReferenceMode mode) (at Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs:49)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:219)
ES3Types.ES3ListType.Write (System.Object obj, ES3Writer writer, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs:29)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:202)
ES3Writer.Write (System.Object value, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:161)
ES3Writer.WriteProperty (System.String name, System.Object value, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:262)
ES3Types.ES3Type_GameObject.WriteObject (System.Object obj, ES3Writer writer, ES3+ReferenceMode mode) (at Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs:49)
ES3Writer.Write (System.Object value, ES3Types.ES3Type type, ES3+ReferenceMode memberReferenceMode) (at Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs:219)
ES3.Serialize[T] (T value, ES3Settings settings) (at Assets/Plugins/Easy Save 3/Scripts/ES3.cs:779)
ES3File.Save[T] (System.String key, T value) (at Assets/Plugins/Easy Save 3/Scripts/ES3File.cs:154)
ES3.Save[T] (System.String key, T value, ES3Settings settings) (at Assets/Plugins/Easy Save 3/Scripts/ES3.cs:100)
GameState.SaveGridObject (System.Int32 objectIndex) (at Assets/Scripts/Serialization/GameState.cs:73)
GameState.Save () (at Assets/Scripts/Serialization/GameState.cs:38)
GameStateManager+<CaptureGameStateNextUpdate>d__3.MoveNext () (at Assets/Scripts/Serialization/GameStateManager.cs:25)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <9baebf9af86541678fd15bfdbf5f26eb>:0)
User avatar
Joel
Moodkie Staff
Posts: 4826
Joined: Wed Nov 07, 2012 10:32 pm

Re: InvalidCastException issue

Post by Joel »

Hi there,

I don’t appear to be getting this issue at my end, and I’ve had no other reports of this.

Firstly, if you’re not using the latest version of Easy Save I recommend updating and deleting Assets/Easy Save 3/Types/, if it exists.

If this doesn’t resolve the issue, please could you create a new project containing only Easy Save with a simple scene which replicates your issue and private message it to me.

All the best,
Joel
Joel @ Moodkie Interactive
Purchase Easy Save | Contact | Guides | Docs | Getting started
ShaunBartoo
Posts: 5
Joined: Wed May 05, 2021 11:09 pm

Re: InvalidCastException issue

Post by ShaunBartoo »

I resolved this by being more selective about what I was serializing. CardData (The class that was causing the exception) is part of the data associated with a "Unit" that I was trying to serialize. rather than serializing each active Unit's GameObject to capture its state, I serialized the prefab for the Unit plus all the variables related to its state individually. I'm still not sure what the actual issue was, but it was being caused by serializing data I didn't actually need, and now that I've refined my serialization script it seems to be fixed.
Thanks for the troubleshooting suggestions Joel!
Post Reply