Forums › 💬 NodeCanvas › ⚙️ Support › Large floats produce serialization errors / data loss
Using very large constant float values can lead to data loss because serialization does not work for them:
1 2 3 4 5 6 7 8 |
Exception: Error while parsing: Bad Int64 format with 1E+21; context = <oat":{"_value":1E+21,"_name":"myFloat","$type":"No> ParadoxNotion.Serialization.FullSerializer.fsResult.AssertSuccess () (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsResult.cs:147) ParadoxNotion.Serialization.FullSerializer.fsJsonParser.Parse (System.String input) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsJsonParser.cs:495) ParadoxNotion.Serialization.JSONSerializer.Deserialize (System.Type type, System.String serializedState, System.Collections.Generic.List 1 objectReferences, System.Object deserialized) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/JSONSerializer.cs:88) ParadoxNotion.Serialization.JSONSerializer.Deserialize[BlackboardSource] (System.String serializedState, System.Collections.Generic.List1 objectReferences, NodeCanvas.Framework.Internal.BlackboardSource deserialized) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/JSONSerializer.cs:67) NodeCanvas.Framework.Blackboard.UnityEngine.ISerializationCallbackReceiver.OnAfterDeserialize () (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/Runtime/Variables/Blackboard.cs:46) UnityEditor.AssetPreviewUpdater:CreatePreviewForAsset(Object, Object[], String) |
or
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
OverflowException: Value 1E+33 is greater than Decimal.MaxValue or less than Decimal.MinValue System.Decimal..ctor (Single value) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/Decimal.cs:184) System.Decimal.op_Explicit (Single value) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/Decimal.cs:453) ParadoxNotion.Serialization.FullSerializer.Internal.fsPrimitiveConverter.TrySerialize (System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& serialized, System.Type storageType) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/Converters/fsPrimitiveConverter.cs:70) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_4_Converter (System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:671) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_2_Inheritance (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:621) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_1_ProcessCycles (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:581) ParadoxNotion.Serialization.FullSerializer.fsSerializer.TrySerialize (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:565) ParadoxNotion.Serialization.FullSerializer.Internal.fsReflectedConverter.TrySerialize (System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& serialized, System.Type storageType) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/Converters/fsReflectedConverter.cs:51) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_4_Converter (System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:671) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_2_Inheritance (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:621) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_1_ProcessCycles (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:602) ParadoxNotion.Serialization.FullSerializer.fsSerializer.TrySerialize (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:565) ParadoxNotion.Serialization.FullSerializer.fsSerializer.TrySerialize (System.Type storageType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:539) ParadoxNotion.Serialization.FullSerializer.Internal.fsDictionaryConverter.TrySerialize (System.Object instance_, ParadoxNotion.Serialization.FullSerializer.fsData& serialized, System.Type storageType) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/Converters/fsDictionaryConverter.cs:82) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_4_Converter (System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:671) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_2_Inheritance (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:621) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_1_ProcessCycles (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:602) ParadoxNotion.Serialization.FullSerializer.fsSerializer.TrySerialize (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:565) ParadoxNotion.Serialization.FullSerializer.Internal.fsReflectedConverter.TrySerialize (System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& serialized, System.Type storageType) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/Converters/fsReflectedConverter.cs:51) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_4_Converter (System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:671) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_2_Inheritance (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:621) ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalSerialize_1_ProcessCycles (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:602) ParadoxNotion.Serialization.FullSerializer.fsSerializer.TrySerialize (System.Type storageType, System.Type overrideConverterType, System.Object instance, ParadoxNotion.Serialization.FullSerializer.fsData& data) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/fsSerializer.cs:565) ParadoxNotion.Serialization.JSONSerializer.Serialize (System.Type type, System.Object value, Boolean pretyJson, System.Collections.Generic.List 1 objectReferences) (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/_Commons/Runtime/Serialization/JSONSerializer.cs:55) NodeCanvas.Framework.Blackboard.UnityEngine.ISerializationCallbackReceiver.OnBeforeSerialize () (at Assets/External/Plugins/ParadoxNotion/NodeCanvas/Framework/Runtime/Variables/Blackboard.cs:37) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) |
Repro:
– Create prefab in library
– Select prefab in library (do not instantiate in scene)
– Add blackboard component
– Add float variable
– Add a bool variable
– Add some other variables as you like, actually 😉
– Set a float value to 100000000000000000000000000
– Save project
– Reopen project
– All blackboard variables gone.
As graphs are also serialized through the same mechanism, it may also effect them. Quick test:
– New scene
– New FSMOwner to scene
– Add bound graph
– Create some action nodes with transitions
– Add a “Set Float” action
– Set a dynamic variable to 1e+35
– Try to export graph as JSON
– No JSON file generated
– Maybe also serialization in scene fails (save scene + reopen). At least you will get the old version of the graph
My use case was actually to set a float variable to positive infinity through SetFloat action.
NC 2.6.3 on Unity 2017.1.1p4
Hello,
Thanks for the report.
I am looking at this ASAP and I will let you know!
Hey,
So, the parsing is fixed. You can open up fsJsonParser.cs and at line #244,
Change this:
1 2 3 |
if (numberString.Contains(".") || numberString == "Infinity" || numberString == "-Infinity" || numberString == "NaN") { |
To this:
1 2 3 4 |
if (numberString.Contains(".") || numberString.Contains("e") || numberString.Contains("E") || numberString == "Infinity" || numberString == "-Infinity" || numberString == "NaN") { |
This will take care of the parsing error.
The second error about serializing “1e+35” is not yet fixed though.
If you want to set a variable to infinity via the SetFloat action, you can do so by actually writing “Infinity” in the “Value B” to set 🙂
[attachment file=”SetInfinity.png”]
Thanks again for the report.