public static void Deserialize(JsonObject root, List <MultiJsonEntry> entries, bool rewriteIds) { if (isDeserializing) { throw new InvalidOperationException("Nested MultiJson deserialization is not supported."); } try { isDeserializing = true; for (var index = 0; index < entries.Count; index++) { var entry = entries[index]; try { var value = index == 0 ? root : CreateInstance(entry.type); var id = entry.id; if (id != null) { // Need to make sure that references looking for the old ID will find it in spite of // ID rewriting. valueMap[id] = value; } if (rewriteIds || entry.id == null) { id = value.objectId; entries[index] = new MultiJsonEntry(entry.type, id, entry.json); valueMap[id] = value; } s_ObjectIdField.SetValue(value, id); } catch (Exception e) { // External code could throw exceptions, but we don't want that to fail the whole thing. // Potentially, the fallback type should also be used here. Debug.LogException(e); } } s_Entries = entries; // Not a foreach because `entries` can be populated by calls to `Enqueue` as we go. for (var i = 0; i < entries.Count; i++) { var entry = entries[i]; try { var value = valueMap[entry.id]; EditorJsonUtility.FromJsonOverwrite(entry.json, value); // Set ID again as it could be overwritten from JSON. s_ObjectIdField.SetValue(value, entry.id); value.OnAfterDeserialize(entry.json); } catch (Exception e) { Debug.LogException(e); } } s_Entries = null; foreach (var entry in entries) { try { var value = valueMap[entry.id]; value.OnAfterMultiDeserialize(entry.json); } catch (Exception e) { Debug.LogException(e); } } } finally { valueMap.Clear(); isDeserializing = false; } }
public static void Deserialize(JsonObject root, List <MultiJsonEntry> entries, bool rewriteIds) { if (isDeserializing) { throw new InvalidOperationException("Nested MultiJson deserialization is not supported."); } try { isDeserializing = true; currentRoot = root; root.ChangeVersion(0); //Same issue as described in CreateInstance for (var index = 0; index < entries.Count; index++) { var entry = entries[index]; try { JsonObject value = null; if (index == 0) { value = root; } else { value = CreateInstanceForDeserialization(entry.type); } var id = entry.id; if (id != null) { // Need to make sure that references looking for the old ID will find it in spite of // ID rewriting. valueMap[id] = value; } if (rewriteIds || entry.id == null) { id = value.objectId; entries[index] = new MultiJsonEntry(entry.type, id, entry.json); valueMap[id] = value; } s_ObjectIdField.SetValue(value, id); } catch (Exception e) { // External code could throw exceptions, but we don't want that to fail the whole thing. // Potentially, the fallback type should also be used here. Debug.LogException(e); } } s_Entries = entries; // Not a foreach because `entries` can be populated by calls to `Enqueue` as we go. for (var i = 0; i < entries.Count; i++) { var entry = entries[i]; try { var value = valueMap[entry.id]; value.Deserailize(entry.type, entry.json); // Set ID again as it could be overwritten from JSON. s_ObjectIdField.SetValue(value, entry.id); value.OnAfterDeserialize(entry.json); } catch (Exception e) { if (!String.IsNullOrEmpty(entry.id)) { var value = valueMap[entry.id]; if (value != null) { Debug.LogError($"Exception thrown while deserialize object of type {entry.type}: {e.Message}"); } } Debug.LogException(e); } } s_Entries = null; foreach (var entry in entries) { try { var value = valueMap[entry.id]; value.OnAfterMultiDeserialize(entry.json); } catch (Exception e) { Debug.LogException(e); } } } finally { valueMap.Clear(); currentRoot = null; isDeserializing = false; } }