Пример #1
0
    public void AddImportedObj(string typeNameMask = null)
    {
        if (_dataToImport == null || _lstPosToSerialize == null || _lstTypeToSerialize == null)
        {
            return;
        }

        MemoryStream ms = new MemoryStream(_dataToImport);
        BinaryReader br = new BinaryReader(ms);
        int          n  = _lstTypeToSerialize.Count;
        List <ISceneSerializableObjAgent> lstObjToSerialize = new List <ISceneSerializableObjAgent>(n);

        for (int i = n - 1; i >= 0; i--)
        {
            string typeName = _lstTypeToSerialize[i];
            long   pos      = _lstPosToSerialize[i];
            if (typeNameMask != null && !typeName.Equals(typeNameMask))
            {
                continue;
            }

            try
            {
                System.Type t = System.Type.GetType(typeName);                  //If necessary, we can use a hashset to optimize this.
                ISceneSerializableObjAgent obj = System.Activator.CreateInstance(t) as ISceneSerializableObjAgent;
                br.BaseStream.Seek(pos, SeekOrigin.Begin);
                obj.Deserialize(br);
                lstObjToSerialize.Add(obj);
            }
            catch (Exception e)
            {
                throw new System.Exception("[SceneMan]Wrong save data format: DataType " + typeName + "\nDetail:" + e);
            }
            _lstTypeToSerialize.RemoveAt(i);
            _lstPosToSerialize.RemoveAt(i);
        }
        SceneMan.AddSceneObjs(lstObjToSerialize);
    }
Пример #2
0
    // Pathea.ISerializable : Save Load
    //=================================
    byte[] Export()
    {
        MemoryStream ms = new MemoryStream();
        BinaryWriter bw = new BinaryWriter(ms);

        bw.Write(ArchiveVer);

        _idGen.Serialize(bw);

        List <ISceneSerializableObjAgent> lstObjToSerialize = new List <ISceneSerializableObjAgent>();

        _lstIsActive.ForEach(it => {
            ISceneSerializableObjAgent itSerializable = it as ISceneSerializableObjAgent;
            if (itSerializable != null)
            {
                lstObjToSerialize.Add(itSerializable);
            }
        });
        _lstToActive.ForEach(it => {
            ISceneSerializableObjAgent itSerializable = it as ISceneSerializableObjAgent;
            if (itSerializable != null)
            {
                lstObjToSerialize.Add(itSerializable);
            }
        });
        _lstInactive.ForEach(it => {
            ISceneSerializableObjAgent itSerializable = it as ISceneSerializableObjAgent;
            if (itSerializable != null)
            {
                lstObjToSerialize.Add(itSerializable);
            }
        });
        _lstIdle.ForEach(it => {
            ISceneSerializableObjAgent itSerializable = it as ISceneSerializableObjAgent;
            if (itSerializable != null)
            {
                lstObjToSerialize.Add(itSerializable);
            }
        });

        int n = lstObjToSerialize.Count;

        bw.Write(n);
        for (int i = 0; i < n; i++)
        {
            ISceneSerializableObjAgent obj = lstObjToSerialize[i];
            bw.Write(obj.GetType().Name);
            bw.Write(0);                // placeholder
            try{
                long posBeg = bw.BaseStream.Position;
                obj.Serialize(bw);
                long posEnd = bw.BaseStream.Position;
                bw.BaseStream.Seek(posBeg - sizeof(int), SeekOrigin.Begin);
                bw.Write((int)(posEnd - posBeg));
                bw.BaseStream.Seek(posEnd, SeekOrigin.Begin);
            } catch {
                Debug.LogError("[SceneMan]Failed to export " + obj.GetType() + obj.Id);
            }
        }
        bw.Close();
        ms.Close();
        return(ms.ToArray());
    }