public void SaveTo(SaveEntryFolder parentFolder, IArchiveContext archiveContext)
        {
            int             entryCount = this._containerType == ContainerType.Dictionary ? this._elementCount * 2 : this._elementCount;
            SaveEntryFolder folder     = archiveContext.CreateFolder(parentFolder, new FolderId(this.ObjectId, SaveFolderExtension.Container), entryCount);

            for (int id = 0; id < this._elementCount; ++id)
            {
                ElementSaveData elementSaveData = this._values[id];
                BinaryWriter    binaryWriter1   = BinaryWriterFactory.GetBinaryWriter();
                BinaryWriter    binaryWriter2   = binaryWriter1;
                elementSaveData.SaveTo((IWriter)binaryWriter2);
                folder.CreateEntry(new EntryId(id, SaveEntryExtension.Value)).FillFrom(binaryWriter1);
                BinaryWriterFactory.ReleaseBinaryWriter(binaryWriter1);
                if (this._containerType == ContainerType.Dictionary)
                {
                    ElementSaveData key           = this._keys[id];
                    BinaryWriter    binaryWriter3 = BinaryWriterFactory.GetBinaryWriter();
                    BinaryWriter    binaryWriter4 = binaryWriter3;
                    key.SaveTo((IWriter)binaryWriter4);
                    folder.CreateEntry(new EntryId(id, SaveEntryExtension.Key)).FillFrom(binaryWriter3);
                    BinaryWriterFactory.ReleaseBinaryWriter(binaryWriter3);
                }
            }
            foreach (ObjectSaveData childStruct in this._childStructs)
            {
                childStruct.SaveTo(folder, archiveContext);
            }
        }
        private static void SaveStringTo(SaveEntryFolder stringsFolder, int id, string value)
        {
            BinaryWriter binaryWriter = BinaryWriterFactory.GetBinaryWriter();

            binaryWriter.WriteString(value);
            stringsFolder.CreateEntry(new EntryId(id, SaveEntryExtension.Txt)).FillFrom(binaryWriter);
            BinaryWriterFactory.ReleaseBinaryWriter(binaryWriter);
        }
 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);
     }
 }
        public void SaveHeaderTo(SaveEntryFolder parentFolder, IArchiveContext archiveContext)
        {
            SaveEntryFolder folder       = archiveContext.CreateFolder(parentFolder, new FolderId(this.ObjectId, SaveFolderExtension.Container), 1);
            BinaryWriter    binaryWriter = BinaryWriterFactory.GetBinaryWriter();

            this._typeDefinition.SaveId.WriteTo((IWriter)binaryWriter);
            binaryWriter.WriteByte((byte)this._containerType);
            binaryWriter.WriteInt(this.GetElementCount());
            EntryId entryId = new EntryId(-1, SaveEntryExtension.Object);

            folder.CreateEntry(entryId).FillFrom(binaryWriter);
            BinaryWriterFactory.ReleaseBinaryWriter(binaryWriter);
        }