/// <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; } }
/// <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); }
/// <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); }
/// <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); }
/// <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; } }
/// <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; } }
/// <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); }
/// <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(); }
/// <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)); }
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); }
public static T Clone <T>(T asset, AssetClonerFlags flags, [NotNull] out Dictionary <Guid, Guid> idRemapping) { return((T)Clone((object)asset, flags, out idRemapping)); }
/// <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> _)); }
/// <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); }
/// <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)); }
public static T Clone <T>(T asset, AssetClonerFlags flags = AssetClonerFlags.None) { return((T)Clone((object)asset, flags)); }
/// <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); }
public static T Clone <T>(T asset, AssetClonerFlags flags = AssetClonerFlags.None) { Dictionary <Guid, Guid> idRemapping; return(Clone(asset, flags, out idRemapping)); }
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); }
/// <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)); }
/// <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; }
public static T Clone <T>(T asset, AssetClonerFlags flags = AssetClonerFlags.None) { return(Clone(asset, flags, out Dictionary <Guid, Guid> _)); }
/// <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; }
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)); }
/// <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)); }