Ejemplo n.º 1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="AssetCloner" /> struct.
        /// </summary>
        /// <param name="value">The value to clone.</param>
        /// <param name="flags">Cloning flags</param>
        private AssetCloner(object value, AssetClonerFlags flags)
        {
            this.flags = flags;
            invariantObjects = null;

            // Clone only if value is not a value type
            if (value != null && !value.GetType().IsValueType)
            {
                invariantObjects = new List<object>();
                // TODO: keepOnlySealedOverride is currently ignored
                // TODO Clone is not supporting SourceCodeAsset (The SourceCodeAsset.Text won't be cloned)
                var stream = new MemoryStream();
                var writer = new BinarySerializationWriter(stream);
                writer.Context.SerializerSelector = ClonerSelector;
                var refFlag = (flags & AssetClonerFlags.ReferenceAsNull) != 0
                    ? ContentSerializerContext.AttachedReferenceSerialization.AsNull
                    : ContentSerializerContext.AttachedReferenceSerialization.AsSerializableVersion;
                writer.Context.Set(InvariantObjectListProperty, invariantObjects);
                writer.Context.Set(ContentSerializerContext.SerializeAttachedReferenceProperty, refFlag);
                writer.SerializeExtended(value, ArchiveMode.Serialize);
                writer.Flush();

                // Retrieve back object references
                objectReferences = writer.Context.Get(MemberSerializer.ObjectSerializeReferences);

                streamOrValueType = stream;
            }
            else
            {
                streamOrValueType = value;
                objectReferences = null;
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Clones the specified asset using asset serialization.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <param name="flags">Flags used to control the cloning process</param>
        /// <param name="externalIdentifiable"></param>
        /// <param name="idRemapping">A dictionary containing the remapping of <see cref="IIdentifiable.Id"/> if <see cref="AssetClonerFlags.GenerateNewIdsForIdentifiableObjects"/> has been passed to the cloner.</param>
        /// <returns>A clone of the asset.</returns>
        public static object Clone(object asset, AssetClonerFlags flags, HashSet <IIdentifiable> externalIdentifiable, [NotNull] out Dictionary <Guid, Guid> idRemapping)
        {
            if (asset == null)
            {
                idRemapping = new Dictionary <Guid, Guid>();
                return(null);
            }
            var cloner    = new AssetCloner(asset, flags, externalIdentifiable);
            var newObject = cloner.Clone(out idRemapping);

            return(newObject);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Clones the specified asset using asset serialization.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <param name="flags">Flags used to control the cloning process</param>
        /// <param name="idRemapping">A dictionary containing the remapping of <see cref="IIdentifiable.Id"/> if <see cref="AssetClonerFlags.GenerateNewIdsForIdentifiableObjects"/> has been passed to the cloner.</param>
        /// <returns>A clone of the asset.</returns>
        public static object Clone(object asset, AssetClonerFlags flags, out Dictionary <Guid, Guid> idRemapping)
        {
            if (asset == null)
            {
                idRemapping = null;
                return(null);
            }
            var cloner    = new AssetCloner(asset, flags);
            var newObject = cloner.Clone(out idRemapping);

            return(newObject);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Generates a runtime hash id from the serialization of this asset.
        /// </summary>
        /// <param name="asset">The asset to get the runtime hash id</param>
        /// <param name="flags">Flags used to control the serialization process</param>
        /// <returns>An object id</returns>
        internal static ObjectId ComputeHash(object asset, AssetClonerFlags flags = AssetClonerFlags.None)
        {
            if (asset == null)
            {
                return(ObjectId.Empty);
            }

            var cloner = new AssetCloner(asset, flags, null);
            var result = cloner.GetHashId();

            return(result);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="AssetCloner" /> struct.
        /// </summary>
        /// <param name="value">The value to clone.</param>
        /// <param name="flags">Cloning flags</param>
        private AssetCloner(object value, AssetClonerFlags flags)
        {
            this.flags          = flags;
            invariantObjects    = null;
            objectReferences    = null;
            clonedObjectMapping = new Dictionary <object, object>();
            cloningIdRemapping  = null;
            // Clone only if value is not a value type
            if (value != null && !value.GetType().IsValueType)
            {
                invariantObjects = new List <object>();

                // TODO: keepOnlySealedOverride is currently ignored
                // TODO Clone is not supporting SourceCodeAsset (The SourceCodeAsset.Text won't be cloned)

                var stream = new MemoryStream();
                var writer = new BinarySerializationWriter(stream);
                writer.Context.SerializerSelector = ClonerSelector;
                var refFlag = (flags & AssetClonerFlags.ReferenceAsNull) != 0
                    ? ContentSerializerContext.AttachedReferenceSerialization.AsNull
                    : ContentSerializerContext.AttachedReferenceSerialization.AsSerializableVersion;
                writer.Context.Set(InvariantObjectListProperty, invariantObjects);
                writer.Context.Set(ContentSerializerContext.SerializeAttachedReferenceProperty, refFlag);
                writer.SerializeExtended(value, ArchiveMode.Serialize);
                writer.Flush();

                // Retrieve back all object references that were discovered while serializing
                // They will be used layer by OnObjectDeserialized when cloning ShadowObject datas
                var objectRefs = writer.Context.Get(MemberSerializer.ObjectSerializeReferences);
                if (objectRefs != null)
                {
                    // Remap object references to a simple array
                    objectReferences = new object[objectRefs.Count];
                    foreach (var objRef in objectRefs)
                    {
                        objectReferences[objRef.Value] = objRef.Key;
                    }
                }

                streamOrValueType = stream;
            }
            else
            {
                streamOrValueType = value;
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Initializes a new instance of the <see cref="AssetCloner" /> struct.
        /// </summary>
        /// <param name="value">The value to clone.</param>
        /// <param name="flags">Cloning flags</param>
        private AssetCloner(object value, AssetClonerFlags flags)
        {
            this.flags = flags;
            invariantObjects = null;
            objectReferences = null;

            // Clone only if value is not a value type
            if (value != null && !value.GetType().IsValueType)
            {
                invariantObjects = new List<object>();

                // TODO: keepOnlySealedOverride is currently ignored
                // TODO Clone is not supporting SourceCodeAsset (The SourceCodeAsset.Text won't be cloned)

                var stream = new MemoryStream();
                var writer = new BinarySerializationWriter(stream);
                writer.Context.SerializerSelector = ClonerSelector;
                var refFlag = (flags & AssetClonerFlags.ReferenceAsNull) != 0
                    ? ContentSerializerContext.AttachedReferenceSerialization.AsNull
                    : ContentSerializerContext.AttachedReferenceSerialization.AsSerializableVersion;
                writer.Context.Set(InvariantObjectListProperty, invariantObjects);
                writer.Context.Set(ContentSerializerContext.SerializeAttachedReferenceProperty, refFlag);
                writer.SerializeExtended(value, ArchiveMode.Serialize);
                writer.Flush();

                // Retrieve back all object references that were discovered while serializing
                // They will be used layer by OnObjectDeserialized when cloning ShadowObject datas
                var objectRefs = writer.Context.Get(MemberSerializer.ObjectSerializeReferences);
                if (objectRefs != null)
                {
                    // Remap object references to a simple array
                    objectReferences = new object[objectRefs.Count];
                    foreach (var objRef in objectRefs)
                    {
                        objectReferences[objRef.Value] = objRef.Key;
                    }
                }

                streamOrValueType = stream;
            }
            else
            {
                streamOrValueType = value;
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Clones the specified asset using asset serialization.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <param name="flags">Flags used to control the cloning process</param>
        /// <returns>A clone of the asset.</returns>
        public static object Clone(object asset, AssetClonerFlags flags = AssetClonerFlags.None)
        {
            if (asset == null)
            {
                return(null);
            }
            var cloner    = new AssetCloner(asset, flags);
            var newObject = cloner.Clone();

            // By default, a clone doesn't copy the base/baseParts for Asset
            if ((flags & AssetClonerFlags.KeepBases) == 0)
            {
                var newAsset = newObject as Asset;
                if (newAsset != null)
                {
                    newAsset.Base      = null;
                    newAsset.BaseParts = null;
                }
            }
            return(newObject);
        }
Ejemplo n.º 8
0
 /// <summary>
 /// Clones the specified asset using asset serialization.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="flags">Flags used to control the cloning process</param>
 /// <returns>A clone of the asset.</returns>
 public static object Clone(object asset, AssetClonerFlags flags = AssetClonerFlags.None)
 {
     if (asset == null)
     {
         return null;
     }
     var cloner = new AssetCloner(asset, flags);
     return cloner.Clone();
 }
Ejemplo n.º 9
0
 /// <summary>
 /// Computes a stable hash from an asset including all meta informations (ids, overrides).
 /// </summary>
 /// <param name="asset">An object instance</param>
 /// <param name="flags">Flags used to control the serialization process</param>
 /// <returns>a stable hash</returns>
 public static ObjectId Compute(object asset, AssetClonerFlags flags = AssetClonerFlags.None)
 {
     return(AssetCloner.ComputeHash(asset, flags));
 }
Ejemplo n.º 10
0
        public AssetItem Clone(bool keepPackage, UFile newLocation = null, Asset newAsset = null, AssetClonerFlags flags = AssetClonerFlags.None)
        {
            // Set the package after the new AssetItem(), to make sure that isDirty is not going to call a notification on the
            // package
            var item = new AssetItem(newLocation ?? location, newAsset ?? AssetCloner.Clone(Asset, flags), keepPackage ? Package : null)
            {
                isDirty       = isDirty,
                SourceFolder  = SourceFolder,
                SourceProject = SourceProject,
                version       = Version
            };

            YamlMetadata.CopyInto(item.YamlMetadata);
            return(item);
        }
Ejemplo n.º 11
0
 public static T Clone <T>(T asset, AssetClonerFlags flags, [NotNull] out Dictionary <Guid, Guid> idRemapping)
 {
     return((T)Clone((object)asset, flags, out idRemapping));
 }
Ejemplo n.º 12
0
 /// <summary>
 /// Clones the specified asset using asset serialization.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="flags">Flags used to control the cloning process</param>
 /// <returns>A clone of the asset.</returns>
 public static object Clone(object asset, AssetClonerFlags flags = AssetClonerFlags.None)
 {
     return(Clone(asset, flags, out Dictionary <Guid, Guid> _));
 }
Ejemplo n.º 13
0
        /// <summary>
        /// Clones this instance without the attached package.
        /// </summary>
        /// <param name="newLocation">The new location that will be used in the cloned <see cref="AssetItem" />. If this parameter
        /// is null, it keeps the original location of the asset.</param>
        /// <param name="newAsset">The new asset that will be used in the cloned <see cref="AssetItem" />. If this parameter
        /// is null, it clones the original asset. otherwise, the specified asset is used as-is in the new <see cref="AssetItem" />
        /// (no clone on newAsset is performed)</param>
        /// <param name="copyPackage">if set to <c>true</c> copy package information, only used by the <see cref="AssetDependencyManager" />.</param>
        /// <param name="flags">Flags used with <see cref="AssetCloner.Clone"/>.</param>
        /// <returns>A clone of this instance.</returns>
        internal AssetItem Clone(bool keepPackage, UFile newLocation = null, Asset newAsset = null, AssetClonerFlags flags = AssetClonerFlags.None)
        {
            // Set the package after the new AssetItem(), to make sure that isDirty is not going to call a notification on the
            // package
            var item = new AssetItem(newLocation ?? location, newAsset ?? AssetCloner.Clone(Asset, flags), keepPackage ? Package : null)
            {
                isDirty       = isDirty,
                SourceFolder  = SourceFolder,
                SourceProject = SourceProject,
                Overrides     = Overrides != null ? new Dictionary <YamlAssetPath, OverrideType>(Overrides) : null
            };

            return(item);
        }
Ejemplo n.º 14
0
 /// <summary>
 /// Clones this instance without the attached package.
 /// </summary>
 /// <param name="newLocation">The new location that will be used in the cloned <see cref="AssetItem"/>. If this parameter
 /// is null, it keeps the original location of the asset.</param>
 /// <param name="newAsset">The new asset that will be used in the cloned <see cref="AssetItem"/>. If this parameter
 /// is null, it clones the original asset. otherwise, the specified asset is used as-is in the new <see cref="AssetItem"/>
 /// (no clone on newAsset is performed)</param>
 /// <param name="flags">Flags used with <see cref="AssetCloner.Clone"/>.</param>
 /// <returns>A clone of this instance.</returns>
 public AssetItem Clone(UFile newLocation = null, Asset newAsset = null, AssetClonerFlags flags = AssetClonerFlags.None)
 {
     return(Clone(false, newLocation, newAsset, flags));
 }
Ejemplo n.º 15
0
 public static T Clone <T>(T asset, AssetClonerFlags flags = AssetClonerFlags.None)
 {
     return((T)Clone((object)asset, flags));
 }
Ejemplo n.º 16
0
 /// <summary>
 /// Computes a stable hash from an asset including all meta informations (ids, overrides).
 /// </summary>
 /// <param name="asset">An object instance</param>
 /// <param name="flags">Flags used to control the serialization process</param>
 /// <returns>a stable hash</returns>
 public static ObjectId Compute(object asset, AssetClonerFlags flags = AssetClonerFlags.None)
 {
     return AssetCloner.ComputeHash(asset, flags);
 }
Ejemplo n.º 17
0
        public static T Clone <T>(T asset, AssetClonerFlags flags = AssetClonerFlags.None)
        {
            Dictionary <Guid, Guid> idRemapping;

            return(Clone(asset, flags, out idRemapping));
        }
Ejemplo n.º 18
0
 private static ContentSerializerContext.AttachedReferenceSerialization GenerateContentSerializerFlags(AssetClonerFlags flags)
 {
     ContentSerializerContext.AttachedReferenceSerialization refFlag;
     if ((flags & AssetClonerFlags.ReferenceAsNull) != 0)
     {
         refFlag = ContentSerializerContext.AttachedReferenceSerialization.AsNull;
     }
     else if ((flags & AssetClonerFlags.KeepReferences) != 0)
     {
         refFlag = ContentSerializerContext.AttachedReferenceSerialization.Clone;
     }
     else
     {
         refFlag = ContentSerializerContext.AttachedReferenceSerialization.AsSerializableVersion;
     }
     return(refFlag);
 }
Ejemplo n.º 19
0
 /// <summary>
 /// Clones the specified asset using asset serialization.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="flags">Flags used to control the cloning process</param>
 /// <param name="idRemapping">A dictionary containing the remapping of <see cref="IIdentifiable.Id"/> if <see cref="AssetClonerFlags.GenerateNewIdsForIdentifiableObjects"/> has been passed to the cloner.</param>
 /// <returns>A clone of the asset.</returns>
 public static object Clone(object asset, AssetClonerFlags flags, [NotNull] out Dictionary <Guid, Guid> idRemapping)
 {
     return(Clone(asset, flags, null, out idRemapping));
 }
Ejemplo n.º 20
0
        /// <summary>
        /// Clones the specified asset using asset serialization.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <param name="flags">Flags used to control the cloning process</param>
        /// <returns>A clone of the asset.</returns>
        public static object Clone(object asset, AssetClonerFlags flags = AssetClonerFlags.None)
        {
            if (asset == null)
            {
                return null;
            }
            var cloner = new AssetCloner(asset, flags);
            var newObject = cloner.Clone();

            // By default, a clone doesn't copy the base/baseParts for Asset
            if ((flags & AssetClonerFlags.KeepBases) == 0)
            {
                var newAsset = newObject as Asset;
                if (newAsset != null)
                {
                    newAsset.Base = null;
                    newAsset.BaseParts = null;
                }
            }
            return newObject;
        }
Ejemplo n.º 21
0
 public static T Clone <T>(T asset, AssetClonerFlags flags = AssetClonerFlags.None)
 {
     return(Clone(asset, flags, out Dictionary <Guid, Guid> _));
 }
Ejemplo n.º 22
0
        /// <summary>
        /// Generates a runtime hash id from the serialization of this asset.
        /// </summary>
        /// <param name="asset">The asset to get the runtime hash id</param>
        /// <param name="flags">Flags used to control the serialization process</param>
        /// <returns>An object id</returns>
        internal static ObjectId ComputeHash(object asset, AssetClonerFlags flags = AssetClonerFlags.None)
        {
            if (asset == null)
            {
                return ObjectId.Empty;
            }

            var cloner = new AssetCloner(asset, flags);
            var result = cloner.GetHashId();
            return result;
        }
Ejemplo n.º 23
0
 public static T Clone <T>(T asset, AssetClonerFlags flags, HashSet <IIdentifiable> externalIdentifiable, [NotNull] out Dictionary <Guid, Guid> idRemapping)
 {
     return((T)Clone((object)asset, flags, externalIdentifiable, out idRemapping));
 }
Ejemplo n.º 24
0
        /// <summary>
        /// Clones the specified asset using asset serialization.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <param name="flags">Flags used to control the cloning process</param>
        /// <returns>A clone of the asset.</returns>
        public static object Clone(object asset, AssetClonerFlags flags = AssetClonerFlags.None)
        {
            Dictionary <Guid, Guid> idMapping;

            return(Clone(asset, flags, out idMapping));
        }