//----------------------------------------------------------------------- // // Copyright (c) 2018 Sirenix IVS // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //----------------------------------------------------------------------- namespace VRC.Udon.Serialization.OdinSerializer { using System; using System.Collections.Generic; using UnityEngine; using Utilities; /// /// Unity serialized data struct that contains all data needed by Odin serialization. /// [Serializable] public struct SerializationData { /// /// The name of the field. /// public const string PrefabModificationsReferencedUnityObjectsFieldName = "PrefabModificationsReferencedUnityObjects"; /// /// The name of the field. /// public const string PrefabModificationsFieldName = "PrefabModifications"; /// /// The name of the field. /// public const string PrefabFieldName = "Prefab"; /// /// The data format used by the serializer. This field will be automatically set to the format specified in the global serialization config /// when the Unity object gets serialized, unless the Unity object implements the interface. /// [SerializeField] public DataFormat SerializedFormat; /// /// The serialized data when serializing with the Binray format. /// [SerializeField] public byte[] SerializedBytes; /// /// All serialized Unity references. /// [SerializeField] public List ReferencedUnityObjects; /// /// Whether the object contains any serialized data. /// [Obsolete("Use ContainsData instead")] public bool HasEditorData { get { switch (this.SerializedFormat) { case DataFormat.Binary: case DataFormat.JSON: return !(this.SerializedBytesString.IsNullOrWhitespace() && (this.SerializedBytes == null || this.SerializedBytes.Length == 0)); case DataFormat.Nodes: return !(this.SerializationNodes == null || this.SerializationNodes.Count == 0); default: throw new NotImplementedException(this.SerializedFormat.ToString()); } } } /// /// Gets a value indicating whether the struct contains any data. /// If this is false, then it could mean that Unity has not yet deserialized the struct. /// public bool ContainsData { get { return // this.SerializedBytesString != null && // Unity serialized strings remains null when an object is created until it's deserialized. this.SerializedBytes != null && this.SerializationNodes != null && this.PrefabModifications != null && this.ReferencedUnityObjects != null; } } /// /// The serialized data when serializing with the JSON format. /// [SerializeField] public string SerializedBytesString; /// /// The reference to the prefab this is only populated in prefab scene instances. /// [SerializeField] public UnityEngine.Object Prefab; /// /// All serialized Unity references. /// [SerializeField] public List PrefabModificationsReferencedUnityObjects; /// /// All Odin serialized prefab modifications. /// [SerializeField] public List PrefabModifications; /// /// The serialized data when serializing with the Nodes format. /// [SerializeField] public List SerializationNodes; /// /// Resets all data. /// public void Reset() { this.SerializedFormat = DataFormat.Binary; if (this.SerializedBytes != null && this.SerializedBytes.Length > 0) { this.SerializedBytes = new byte[0]; } if (this.ReferencedUnityObjects != null && this.ReferencedUnityObjects.Count > 0) { this.ReferencedUnityObjects.Clear(); } this.Prefab = null; if (this.SerializationNodes != null && this.SerializationNodes.Count > 0) { this.SerializationNodes.Clear(); } if (this.SerializedBytesString != null && this.SerializedBytesString.Length > 0) { this.SerializedBytesString = string.Empty; } if (this.PrefabModificationsReferencedUnityObjects != null && this.PrefabModificationsReferencedUnityObjects.Count > 0) { this.PrefabModificationsReferencedUnityObjects.Clear(); } if (this.PrefabModifications != null && this.PrefabModifications.Count > 0) { this.PrefabModifications.Clear(); } } } }