Example #1
0
        public void CollectMembers()
        {
            for (int index = 0; index < this._typeDefinition.MemberDefinitions.Count; ++index)
            {
                MemberDefinition memberDefinition = this._typeDefinition.MemberDefinitions[index];
                MemberSaveData   memberSaveData   = (MemberSaveData)null;
                switch (memberDefinition)
                {
                case PropertyDefinition _:
                    PropertyDefinition propertyDefinition = (PropertyDefinition)memberDefinition;
                    PropertyInfo       propertyInfo       = propertyDefinition.PropertyInfo;
                    MemberTypeId       id1 = propertyDefinition.Id;
                    PropertySaveData   propertySaveData = new PropertySaveData(this, propertyDefinition, id1);
                    this._propertyValues.Add(propertyInfo, propertySaveData);
                    memberSaveData = (MemberSaveData)propertySaveData;
                    break;

                case FieldDefinition _:
                    FieldDefinition fieldDefinition = (FieldDefinition)memberDefinition;
                    FieldInfo       fieldInfo       = fieldDefinition.FieldInfo;
                    MemberTypeId    id2             = fieldDefinition.Id;
                    FieldSaveData   fieldSaveData   = new FieldSaveData(this, fieldDefinition, id2);
                    this._fieldValues.Add(fieldInfo, fieldSaveData);
                    memberSaveData = (MemberSaveData)fieldSaveData;
                    break;
                }
                TypeDefinitionBase typeDefinition1 = this.Context.DefinitionContext.GetTypeDefinition(memberDefinition.GetMemberType());
                if (typeDefinition1 is TypeDefinition typeDefinition3 && !typeDefinition3.IsClassDefinition)
                {
                    ObjectSaveData childStruct = this._childStructs[memberDefinition];
                    memberSaveData.InitializeAsCustomStruct(childStruct.ObjectId);
                }
 public PropertySaveData(
     ObjectSaveData objectSaveData,
     PropertyDefinition propertyDefinition,
     MemberTypeId saveId)
     : base(objectSaveData)
 {
     this.PropertyDefinition = propertyDefinition;
     this.SaveId             = saveId;
 }
 public FieldSaveData(
     ObjectSaveData objectSaveData,
     FieldDefinition fieldDefinition,
     MemberTypeId saveId)
     : base(objectSaveData)
 {
     this.FieldDefinition = fieldDefinition;
     this.SaveId          = saveId;
 }
        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;
        }
        private void CollectObjects(object parent)
        {
            if (this._idsOfChildObjects.ContainsKey(parent))
            {
                return;
            }
            int count = this._childObjects.Count;

            this._childObjects.Add(parent);
            this._idsOfChildObjects.Add(parent, count);
            Type type = parent.GetType();

            ObjectSaveData.GetChildObjects((ISaveContext)this, this.DefinitionContext.GetClassDefinition(type) ?? throw new Exception("Could not find type definition of type: " + (object)type), parent, this._temporaryCollectedObjects);
            for (int index = 0; index < this._temporaryCollectedObjects.Count; ++index)
            {
                object temporaryCollectedObject = this._temporaryCollectedObjects[index];
                if (temporaryCollectedObject != null)
                {
                    this._objectsToIterate.Enqueue(temporaryCollectedObject);
                }
            }
            this._temporaryCollectedObjects.Clear();
        }
        private static void ProcessChildObjectElement(
            object childElement,
            ISaveContext context,
            List <object> collectedObjects)
        {
            Type type    = childElement.GetType();
            bool isClass = type.IsClass;

            if (isClass && type != typeof(string))
            {
                collectedObjects.Add(childElement);
            }
            else
            {
                if (isClass)
                {
                    return;
                }
                TypeDefinition structDefinition = context.DefinitionContext.GetStructDefinition(type);
                if (structDefinition == null)
                {
                    return;
                }
                if (structDefinition.CollectObjectsMethod != null)
                {
                    structDefinition.CollectObjectsMethod(childElement, collectedObjects);
                }
                else
                {
                    for (int index = 0; index < structDefinition.MemberDefinitions.Count; ++index)
                    {
                        MemberDefinition memberDefinition = structDefinition.MemberDefinitions[index];
                        ObjectSaveData.GetChildObjectFrom(context, childElement, memberDefinition, collectedObjects);
                    }
                }
            }
        }
 protected MemberSaveData(ObjectSaveData objectSaveData)
     : base(objectSaveData.Context)
 {
     this.ObjectSaveData = objectSaveData;
 }