Exemplo n.º 1
0
 /// <summary>Creates a new ES3Settings object with the given path.</summary>
 /// <param name="path">The path associated with this ES3Settings object.</param>
 /// <param name="enums">Accepts an ES3.EncryptionType, ES3.CompressionType, ES3.Location, ES3.Directory or ES3.ReferenceMode.</param>
 public ES3Settings(params System.Enum[] enums) : this(true)
 {
     foreach (var setting in enums)
     {
         if (setting is ES3.EncryptionType)
         {
             this.encryptionType = (ES3.EncryptionType)setting;
         }
         else if (setting is ES3.Location)
         {
             this.location = (ES3.Location)setting;
         }
         else if (setting is ES3.CompressionType)
         {
             this.compressionType = (ES3.CompressionType)setting;
         }
         else if (setting is ES3.ReferenceMode)
         {
             this.referenceMode = (ES3.ReferenceMode)setting;
         }
         else if (setting is ES3.Format)
         {
             this.format = (ES3.Format)setting;
         }
         else if (setting is ES3.Directory)
         {
             this.directory = (ES3.Directory)setting;
         }
     }
 }
Exemplo n.º 2
0
        public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode unityObjectType)
        {
            var array = (System.Array)obj;

            if (elementType == null)
            {
                throw new ArgumentNullException("ES3Type argument cannot be null.");
            }

            //writer.StartWriteCollection();

            for (int i = 0; i < array.GetLength(0); i++)
            {
                writer.StartWriteCollectionItem(i);
                writer.StartWriteCollection();
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    writer.StartWriteCollectionItem(j);
                    writer.Write(array.GetValue(i, j), elementType, unityObjectType);
                    writer.EndWriteCollectionItem(j);
                }
                writer.EndWriteCollection();
                writer.EndWriteCollectionItem(i);
            }

            //writer.EndWriteCollection();
        }
Exemplo n.º 3
0
        public virtual void WriteObject(object obj, ES3Writer writer, ES3.ReferenceMode mode)
        {
            if (WriteUsingDerivedType(obj, writer, mode))
            {
                return;
            }

            var instance = obj as UnityEngine.Object;

            if (obj != null && instance == null)
            {
                throw new ArgumentException("Only types of UnityEngine.Object can be written with this method, but argument given is type of " + obj.GetType());
            }

            // If this object is in the instance manager, store it's instance ID with it.
            var refMgr = ES3ReferenceMgrBase.Current;

            if (mode != ES3.ReferenceMode.ByValue)
            {
                if (refMgr == null)
                {
                    throw new InvalidOperationException("An Easy Save 3 Manager is required to load references. To add one to your scene, exit playmode and go to Assets > Easy Save 3 > Add Manager to Scene");
                }
                writer.WriteRef(instance);
                if (mode == ES3.ReferenceMode.ByRef)
                {
                    return;
                }
            }
            WriteUnityObject(instance, writer);
        }
Exemplo n.º 4
0
        public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode)
        {
            if (obj == null)
            {
                writer.WriteNull(); return;
            }
            ;

            var list = (IList)obj;

            if (elementType == null)
            {
                throw new ArgumentNullException("ES3Type argument cannot be null.");
            }

            writer.StartWriteCollection(list.Count);

            int i = 0;

            foreach (object item in list)
            {
                writer.StartWriteCollectionItem(i);
                writer.Write(item, elementType, memberReferenceMode);
                writer.EndWriteCollectionItem(i);
                i++;
            }

            writer.EndWriteCollection();
        }
Exemplo n.º 5
0
        public virtual void WriteObject(object obj, ES3Writer writer, ES3.ReferenceMode mode)
        {
            if (WriteUsingDerivedType(obj, writer))
            {
                return;
            }

            var instance = obj as UnityEngine.Object;

            if (obj != null && instance == null)
            {
                throw new ArgumentException("Only types of UnityEngine.Object can be written with this method, but argument given is type of " + obj.GetType());
            }

            // If this object is in the instance manager, store it's instance ID with it.
            var refMgr = ES3ReferenceMgrBase.Current;

            if (refMgr != null && mode != ES3.ReferenceMode.ByValue)
            {
                writer.WriteRef(instance);
                if (mode == ES3.ReferenceMode.ByRef)
                {
                    return;
                }
            }
            WriteUnityObject(instance, writer);
        }
Exemplo n.º 6
0
    /// <summary>Writes a field or property to the writer. Note that this should only be called within an ES3Type.</summary>
    /// <param name="name">The name of the field or property.</param>
    /// <param name="value">The value we want to write.</param>
    /// <param name="memberReferenceMode">Whether we want to write the property by reference, by value, or both.</param>
    public virtual void WriteProperty(string name, object value, ES3.ReferenceMode memberReferenceMode)
    {
        if (SerializationDepthLimitExceeded())
        {
            return;
        }

        StartWriteProperty(name); Write(value, memberReferenceMode); EndWriteProperty(name);
    }
        public override void WriteObject(object obj, ES3Writer writer, ES3.ReferenceMode mode)
        {
            if (WriteUsingDerivedType(obj, writer))
            {
                return;
            }

            var instance = (UnityEngine.GameObject)obj;

            if (ES3ReferenceMgrBase.Current != null && mode != ES3.ReferenceMode.ByValue)
            {
                var es3Prefab = instance.GetComponent <ES3Prefab>();
                if (es3Prefab != null)
                {
                    writer.WriteProperty(prefabPropertyName, es3Prefab, ES3Type_ES3PrefabInternal.Instance);
                }
                else
                {
                    writer.WriteRef(instance);
                    // Write the ID of this Transform so we can assign it's ID when we load.
                    writer.WriteProperty(transformPropertyName, ES3ReferenceMgrBase.Current.Add(instance.transform));
                }
                if (mode == ES3.ReferenceMode.ByRef)
                {
                    return;
                }
            }

            var es3AutoSave = instance.GetComponent <ES3AutoSave>();

            //if(es3AutoSave == null || es3AutoSave.saveLayer)
            writer.WriteProperty("layer", instance.layer, ES3Type_int.Instance);
            //if(es3AutoSave == null || es3AutoSave.saveTag)
            writer.WriteProperty("tag", instance.tag, ES3Type_string.Instance);
            //if(es3AutoSave == null || es3AutoSave.saveName)
            writer.WriteProperty("name", instance.name, ES3Type_string.Instance);
            //if(es3AutoSave == null || es3AutoSave.saveHideFlags)
            writer.WriteProperty("hideFlags", instance.hideFlags);
            if (es3AutoSave == null || es3AutoSave.saveChildren)
            {
                writer.WriteProperty("children", GetChildren(instance));
            }

            var components = new List <Component>();

            foreach (var component in instance.GetComponents <Component>())
            {
                var componentType = component.GetType();
                // Only save explicitly-supported Components, /*or those explicitly marked as Serializable*/.
                if (ES3TypeMgr.GetES3Type(componentType) != null /*|| ES3Reflection.AttributeIsDefined(componentType, ES3Reflection.serializableAttributeType)*/)
                {
                    components.Add(component);
                }
            }

            writer.WriteProperty("components", components);
        }
Exemplo n.º 8
0
    public virtual void Write(object value, ES3Type type, ES3.ReferenceMode memberReferenceMode = ES3.ReferenceMode.ByRef)
    {
        // Note that we have to check UnityEngine.Object types for null by casting it first, otherwise
        // it will always return false.
        if (value == null || (type.isES3TypeUnityObject && ((UnityEngine.Object)value) == null))
        {
            WriteNull();
            return;
        }

        if (type == null)
        {
            throw new ArgumentNullException("ES3Type argument cannot be null.");
        }
        if (type.isUnsupported)
        {
            throw new NotSupportedException("Types of " + type.type + " are not supported.");
        }

        if (type.isPrimitive)
        {
            type.Write(value, this);
        }
        else if (type.isCollection)
        {
            StartWriteCollection();
            ((ES3CollectionType)type).Write(value, this, memberReferenceMode);
            EndWriteCollection();
        }
        else if (type.isDictionary)
        {
            StartWriteDictionary();
            ((ES3DictionaryType)type).Write(value, this, memberReferenceMode);
            EndWriteDictionary();
        }
        else
        {
            if (type.type == typeof(GameObject))
            {
                ((ES3Type_GameObject)type).saveChildren = settings.saveChildren;
            }

            StartWriteObject(null);

            if (type.isES3TypeUnityObject)
            {
                ((ES3UnityObjectType)type).WriteObject(value, this, memberReferenceMode);
            }
            else
            {
                type.Write(value, this);
            }
            EndWriteObject(null);
        }
    }
Exemplo n.º 9
0
    public virtual void Write(object value, ES3.ReferenceMode memberReferenceMode = ES3.ReferenceMode.ByRef)
    {
        if (value == null)
        {
            WriteNull(); return;
        }

        var type = ES3TypeMgr.GetOrCreateES3Type(value.GetType());

        Write(value, type, memberReferenceMode);
    }
Exemplo n.º 10
0
        public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode)
        {
            var array = (System.Array)obj;

            if (elementType == null)
            {
                throw new ArgumentNullException("ES3Type argument cannot be null.");
            }

            writer.StartWriteCollection(array.Length);

            for (int i = 0; i < array.Length; i++)
            {
                writer.StartWriteCollectionItem(i);
                writer.Write(array.GetValue(i), elementType, memberReferenceMode);
                writer.EndWriteCollectionItem(i);
            }

            writer.EndWriteCollection();
        }
Exemplo n.º 11
0
        public void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode)
        {
            var dict = (IDictionary)obj;

            //writer.StartWriteDictionary(dict.Count);

            int i = 0;

            foreach (System.Collections.DictionaryEntry kvp in dict)
            {
                writer.StartWriteDictionaryKey(i);
                writer.Write(kvp.Key, keyType, memberReferenceMode);
                writer.EndWriteDictionaryKey(i);
                writer.StartWriteDictionaryValue(i);
                writer.Write(kvp.Value, valueType, memberReferenceMode);
                writer.EndWriteDictionaryValue(i);
                i++;
            }

            //writer.EndWriteDictionary();
        }
Exemplo n.º 12
0
    public virtual void Write(object value, ES3Type type, ES3.ReferenceMode memberReferenceMode = ES3.ReferenceMode.ByRef)
    {
        if (value == null)
        {
            WriteNull(); return;
        }
        ;

        if (type == null)
        {
            throw new ArgumentNullException("ES3Type argument cannot be null.");
        }

        if (type.isPrimitive)
        {
            type.Write(value, this);
        }
        else if (type.isCollection)
        {
            ((ES3CollectionType)type).Write(value, this, memberReferenceMode);
        }
        else if (type.isDictionary)
        {
            ((ES3DictionaryType)type).Write(value, this, memberReferenceMode);
        }
        else
        {
            StartWriteObject(null);

            if (type.isUnityObject)
            {
                ((ES3UnityObjectType)type).WriteObject(value, this, memberReferenceMode);
            }
            else
            {
                type.Write(value, this);
            }
            EndWriteObject(null);
        }
    }
Exemplo n.º 13
0
        protected bool WriteUsingDerivedType(object obj, ES3Writer writer, ES3.ReferenceMode mode)
        {
            var objType = obj.GetType();

            if (objType != this.type)
            {
                writer.WriteType(objType);

                var es3Type = ES3TypeMgr.GetOrCreateES3Type(objType);
                if (es3Type is ES3UnityObjectType)
                {
                    ((ES3UnityObjectType)es3Type).WriteObject(obj, writer, mode);
                }
                else
                {
                    es3Type.Write(obj, writer);
                }

                return(true);
            }
            return(false);
        }
Exemplo n.º 14
0
        /// <summary>Writes a field or property to the writer. Note that this should only be called within an ES3Type.</summary>
        /// <param name="name">The name of the field or property.</param>
        /// <param name="value">The value we want to write.</param>
        /// <param name="memberReferenceMode">Whether we want to write the property by reference, by value, or both.</param>
        public override void WriteProperty(string name, object value, ES3.ReferenceMode memberReferenceMode)
        {
            if (SerializationDepthLimitExceeded())
            {
                return;
            }

            StartWriteProperty(name);

            using (var ms = new MemoryStream())
            {
                using (var writer = ES3Writer.Create(ms, new ES3Settings(ES3.EncryptionType.None, ES3.CompressionType.None, ES3.Format.Binary_Alpha), false, false))
                {
                    writer.Write(value, memberReferenceMode);
                }

                var bytes = ms.ToArray();
                Write7BitEncodedInt(bytes.Length);
                baseWriter.Write(bytes);
            }

            EndWriteProperty(name);
        }
Exemplo n.º 15
0
    public virtual void Write(object value, ES3Type type, ES3.ReferenceMode memberReferenceMode = ES3.ReferenceMode.ByRef)
    {
        // Note that we have to check UnityEngine.Object types for null by casting it first, otherwise
        // it will always return false.
        if (value == null || (ES3Reflection.IsAssignableFrom(typeof(UnityEngine.Object), value.GetType()) && value as UnityEngine.Object == null))
        {
            WriteNull();
            return;
        }

        // Deal with System.Objects
        if (type == null || type.type == typeof(object))
        {
            var valueType = value.GetType();
            type = ES3TypeMgr.GetOrCreateES3Type(valueType);

            if (type == null)
            {
                throw new NotSupportedException("Types of " + valueType + " are not supported. Please see the Supported Types guide for more information: https://docs.moodkie.com/easy-save-3/es3-supported-types/");
            }

            if (!type.isCollection && !type.isDictionary)
            {
                StartWriteObject(null);
                WriteType(valueType);

                type.Write(value, this);

                EndWriteObject(null);
                return;
            }
        }

        if (type == null)
        {
            throw new ArgumentNullException("ES3Type argument cannot be null.");
        }
        if (type.isUnsupported)
        {
            if (type.isCollection || type.isDictionary)
            {
                throw new NotSupportedException(type.type + " is not supported because it's element type is not supported. Please see the Supported Types guide for more information: https://docs.moodkie.com/easy-save-3/es3-supported-types/");
            }
            else
            {
                throw new NotSupportedException("Types of " + type.type + " are not supported. Please see the Supported Types guide for more information: https://docs.moodkie.com/easy-save-3/es3-supported-types/");
            }
        }

        if (type.isPrimitive || type.isEnum)
        {
            type.Write(value, this);
        }
        else if (type.isCollection)
        {
            StartWriteCollection();
            ((ES3CollectionType)type).Write(value, this, memberReferenceMode);
            EndWriteCollection();
        }
        else if (type.isDictionary)
        {
            StartWriteDictionary();
            ((ES3DictionaryType)type).Write(value, this, memberReferenceMode);
            EndWriteDictionary();
        }
        else
        {
            if (type.type == typeof(GameObject))
            {
                ((ES3Type_GameObject)type).saveChildren = settings.saveChildren;
            }

            StartWriteObject(null);

            if (type.isES3TypeUnityObject)
            {
                ((ES3UnityObjectType)type).WriteObject(value, this, memberReferenceMode);
            }
            else
            {
                type.Write(value, this);
            }
            EndWriteObject(null);
        }
    }
Exemplo n.º 16
0
        public override void WriteObject(object obj, ES3Writer writer, ES3.ReferenceMode mode)
        {
            if (WriteUsingDerivedType(obj, writer))
            {
                return;
            }
            var instance = (UnityEngine.GameObject)obj;

            if (mode != ES3.ReferenceMode.ByValue)
            {
                writer.WriteRef(instance);

                var es3Prefab = instance.GetComponent <ES3Prefab>();
                if (es3Prefab != null)
                {
                    writer.WriteProperty(prefabPropertyName, es3Prefab, ES3Type_ES3PrefabInternal.Instance);
                }
                // Write the ID of this Transform so we can assign it's ID when we load.
                writer.WriteProperty(transformPropertyName, ES3ReferenceMgrBase.Current.Add(instance.transform));
                if (mode == ES3.ReferenceMode.ByRef)
                {
                    return;
                }
            }

            var es3AutoSave = instance.GetComponent <ES3AutoSave>();

            writer.WriteProperty("layer", instance.layer, ES3Type_int.Instance);
            writer.WriteProperty("tag", instance.tag, ES3Type_string.Instance);
            writer.WriteProperty("name", instance.name, ES3Type_string.Instance);
            writer.WriteProperty("hideFlags", instance.hideFlags);
            writer.WriteProperty("active", instance.activeSelf);

            if (saveChildren || (es3AutoSave != null && es3AutoSave.saveChildren))
            {
                writer.WriteProperty("children", GetChildren(instance), ES3.ReferenceMode.ByRefAndValue);
            }

            List <Component> components;

            // If there's an ES3AutoSave attached and Components are marked to be saved, save these.
            var autoSave = instance.GetComponent <ES3AutoSave>();

            if (autoSave != null && autoSave.componentsToSave != null && autoSave.componentsToSave.Count > 0)
            {
                components = autoSave.componentsToSave;
            }
            // Otherwise, only save explicitly-supported Components, /*or those explicitly marked as Serializable*/.
            else
            {
                components = new List <Component>();
                foreach (var component in instance.GetComponents <Component>())
                {
                    if (component != null && ES3TypeMgr.GetES3Type(component.GetType()) != null)
                    {
                        components.Add(component);
                    }
                }
            }

            writer.WriteProperty("components", components, ES3.ReferenceMode.ByRefAndValue);
        }
Exemplo n.º 17
0
 public virtual void WriteProperty(string name, object value, ES3Type type, ES3.ReferenceMode memberReferenceMode)
 {
     StartWriteProperty(name); Write(value, type, memberReferenceMode);
 }
Exemplo n.º 18
0
 public abstract void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode);