private void SaveSingleContainer(
            ArchiveConcurrentSerializer headerSerializer,
            byte[][] containerData,
            int id)
        {
            object            childContainer    = this._childContainers[id];
            ArchiveSerializer archiveSerializer = new ArchiveSerializer();
            SaveEntryFolder   rootFolder1       = SaveEntryFolder.CreateRootFolder();
            SaveEntryFolder   rootFolder2       = SaveEntryFolder.CreateRootFolder();
            ContainerType     containerType;

            childContainer.GetType().IsContainer(out containerType);
            ContainerSaveData containerSaveData = new ContainerSaveData((ISaveContext)this, id, childContainer, containerType);

            containerSaveData.CollectChildren();
            containerSaveData.CollectStructs();
            containerSaveData.CollectMembers();
            containerSaveData.CollectStrings();
            containerSaveData.SaveHeaderTo(rootFolder2, (IArchiveContext)headerSerializer);
            containerSaveData.SaveTo(rootFolder1, (IArchiveContext)archiveSerializer);
            headerSerializer.SerializeFolderConcurrent(rootFolder2);
            archiveSerializer.SerializeFolder(rootFolder1);
            byte[] binaryData = archiveSerializer.FinalizeAndGetBinaryData();
            containerData[id] = binaryData;
        }
 public bool Save(object target, MetaData metaData)
 {
     Debug.Print("SaveContext::Save");
     try
     {
         this.RootObject = target;
         using (new PerformanceTestBlock("SaveContext::Save"))
         {
             BinaryWriterFactory.Initialize();
             this.CollectObjects();
             ArchiveConcurrentSerializer headerSerializer = new ArchiveConcurrentSerializer();
             byte[][] objectData = new byte[this._childObjects.Count][];
             using (new PerformanceTestBlock("SaveContext::Saving Objects"))
                 TWParallel.For(0, this._childObjects.Count, (Action <int>)(i => this.SaveSingleObject(headerSerializer, objectData, i)));
             byte[][] containerData = new byte[this._childContainers.Count][];
             using (new PerformanceTestBlock("SaveContext::Saving Containers"))
                 TWParallel.For(0, this._childContainers.Count, (Action <int>)(i => this.SaveSingleContainer(headerSerializer, containerData, i)));
             using (new PerformanceTestBlock("SaveContext::SaveObjects config"))
             {
                 SaveEntryFolder rootFolder   = SaveEntryFolder.CreateRootFolder();
                 BinaryWriter    binaryWriter = BinaryWriterFactory.GetBinaryWriter();
                 binaryWriter.WriteInt(this._idsOfChildObjects.Count);
                 binaryWriter.WriteInt(this._strings.Count);
                 binaryWriter.WriteInt(this._idsOfChildContainers.Count);
                 rootFolder.CreateEntry(new EntryId(-1, SaveEntryExtension.Config)).FillFrom(binaryWriter);
                 headerSerializer.SerializeFolderConcurrent(rootFolder);
                 BinaryWriterFactory.ReleaseBinaryWriter(binaryWriter);
             }
             ArchiveSerializer archiveSerializer = new ArchiveSerializer();
             using (new PerformanceTestBlock("SaveContext::SaveObjects strings"))
             {
                 SaveEntryFolder rootFolder = SaveEntryFolder.CreateRootFolder();
                 SaveEntryFolder folder     = archiveSerializer.CreateFolder(rootFolder, new FolderId(-1, SaveFolderExtension.Strings), this._strings.Count);
                 for (int index = 0; index < this._strings.Count; ++index)
                 {
                     string str = this._strings[index];
                     SaveContext.SaveStringTo(folder, index, str);
                 }
                 archiveSerializer.SerializeFolder(rootFolder);
             }
             byte[] header  = (byte[])null;
             byte[] strings = (byte[])null;
             using (new PerformanceTestBlock("SaveContext::FinalizeAndGetBinaryHeaderDataConcurrent"))
                 header = headerSerializer.FinalizeAndGetBinaryDataConcurrent();
             using (new PerformanceTestBlock("SaveContext::FinalizeAndGetBinaryStringDataConcurrent"))
                 strings = archiveSerializer.FinalizeAndGetBinaryData();
             this.SaveData = new GameData(header, strings, objectData, containerData);
             BinaryWriterFactory.Release();
         }
         return(true);
     }
     catch
     {
         return(false);
     }
 }
        private void SaveSingleObject(
            ArchiveConcurrentSerializer headerSerializer,
            byte[][] objectData,
            int id)
        {
            object            childObject       = this._childObjects[id];
            ArchiveSerializer archiveSerializer = new ArchiveSerializer();
            SaveEntryFolder   rootFolder1       = SaveEntryFolder.CreateRootFolder();
            SaveEntryFolder   rootFolder2       = SaveEntryFolder.CreateRootFolder();
            ObjectSaveData    objectSaveData    = new ObjectSaveData((ISaveContext)this, id, childObject, true);

            objectSaveData.CollectStructs();
            objectSaveData.CollectMembers();
            objectSaveData.CollectStrings();
            objectSaveData.SaveHeaderTo(rootFolder2, (IArchiveContext)headerSerializer);
            objectSaveData.SaveTo(rootFolder1, (IArchiveContext)archiveSerializer);
            headerSerializer.SerializeFolderConcurrent(rootFolder2);
            archiveSerializer.SerializeFolder(rootFolder1);
            byte[] binaryData = archiveSerializer.FinalizeAndGetBinaryData();
            objectData[id] = binaryData;
        }