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); }