public void Save(ProjectItem parent, byte[] previewData, object obj, ProjectEventHandler <ProjectItem> callback) { if (obj == null) { throw new ArgumentNullException("obj"); } Type persistentType = m_typeMap.ToPersistentType(obj.GetType()); if (persistentType == null) { throw new ArgumentException(string.Format("PersistentClass for {0} does not exist", obj.GetType()), "obj"); } if (parent == null) { parent = Root; } if (!parent.IsFolder) { throw new ArgumentException("parent is not folder", "parent"); } int ordinal, id; if (!GetOrdinalAndId(m_projectInfo.AssetIdentifier, out ordinal, out id)) { return; } PersistentObject persistentObject = (PersistentObject)Activator.CreateInstance(persistentType); persistentObject.ReadFrom(obj); AssetItem assetItem = new AssetItem(); assetItem.ItemID = m_assetDB.ToRuntimeResourceID(ordinal, id); assetItem.Name = persistentObject.name; assetItem.Ext = GetExt(obj); assetItem.TypeGuid = m_typeMap.ToGuid(obj.GetType()); assetItem.Preview = new Preview { ItemID = assetItem.ItemID, PreviewData = previewData }; if (persistentObject is PersistentPrefab) { PersistentPrefab persistentPrefab = (PersistentPrefab)persistentObject; if (persistentPrefab.Descriptors != null) { List <PrefabPart> prefabParts = new List <PrefabPart>(); PersistentDescriptorsToPrefabPartItems(persistentPrefab.Descriptors, prefabParts); assetItem.Parts = prefabParts.ToArray(); } } GetDepsContext getDepsCtx = new GetDepsContext(); persistentObject.GetDeps(getDepsCtx); assetItem.Dependencies = getDepsCtx.Dependencies.ToArray(); m_storage.Save(m_projectPath, parent.ToString(), assetItem, persistentObject, m_projectInfo, error => { if (!error.HasError) { m_idToAssetItem.Add(assetItem.ItemID, assetItem); if (assetItem.Parts != null) { for (int i = 0; i < assetItem.Parts.Length; ++i) { m_idToAssetItem.Add(assetItem.Parts[i].PartID, assetItem); } } parent.AddChild(assetItem); } callback(error, assetItem); }); }