Esempio n. 1
0
        public List <Tupla> leerLista(Tabla tabla, ComparadorTuplas comparador)
        {
            FileStream archivo = null;

            //archivos.TryGetValue(tabla.getArchivo(), out archivo);
            archivo = new FileStream(tabla.getArchivo(),
                                     FileMode.OpenOrCreate,
                                     FileAccess.ReadWrite,
                                     FileShare.ReadWrite);
            IFormatter   formatter = new BinaryFormatter();
            List <Tupla> lista     = new List <Tupla>();

            while (archivo.Position < archivo.Length)
            {
                //Tupla aux = (Tupla)formatter.Deserialize(archivo);
                Tupla aux = leerYavanzar(archivo, tabla);
                if (aux != null && comparador(aux))
                {
                    lista.Add(aux);
                }
            }
            archivo.Close();
            //archivo.Position = 0;
            return(lista);
        }
Esempio n. 2
0
    /* Construye un archivo con los datos de la clase Vida que es serializable
     * a partir de unos datos de Vida no serializables.
     */
    private static void generarVidaSerializable(Vida vida, ref VidaSerializable vidaSerializable)
    {
        vidaSerializable          = new VidaSerializable();
        vidaSerializable.animales = new List <AnimalSerializable>();
        for (int i = 0; i < vida.animales.Count; i++)
        {
            vidaSerializable.animales.Add(getAnimalSerializable(vida.animales[i]));
        }
        vidaSerializable.vegetales = new List <VegetalSerializable>();
        for (int i = 0; i < vida.vegetales.Count; i++)
        {
            vidaSerializable.vegetales.Add(getVegetalSerializable(vida.vegetales[i]));
        }
        vidaSerializable.edificios = new List <EdificioSerializable>();
        for (int i = 0; i < vida.edificios.Count; i++)
        {
            vidaSerializable.edificios.Add(getEdificioSerializable(vida.edificios[i]));
        }
        vidaSerializable.idActualAnimal   = vida.idActualAnimal;
        vidaSerializable.idActualEdificio = vida.idActualEdificio;
        vidaSerializable.idActualVegetal  = vida.idActualVegetal;

        vidaSerializable.posicionesColindantes = new List <Tupla <int, int> >();
        for (int i = 0; i < vida.posicionesColindantes.Count; i++)
        {
            Tupla <int, int> tupla = new Tupla <int, int>(vida.posicionesColindantes[i].e1, vida.posicionesColindantes[i].e2);
            vidaSerializable.posicionesColindantes.Add(tupla);
        }

        generarTableroSerializable(vida.tablero, ref vidaSerializable.tablero);
    }
Esempio n. 3
0
    private static EdificioSerializable getEdificioSerializable(Edificio edi)
    {
        EdificioSerializable resultado = new EdificioSerializable();

        resultado.compAvzConsumidosPorTurno = edi.compAvzConsumidosPorTurno;
        resultado.compAvzProducidosPorTurno = edi.compAvzProducidosPorTurno;
        resultado.compBasConsumidosPorTurno = edi.compBasConsumidosPorTurno;
        resultado.compBasProducidosPorTurno = edi.compBasProducidosPorTurno;
        resultado.energiaConsumidaPorTurno  = edi.energiaConsumidaPorTurno;
        resultado.energiaProducidaPorTurno  = edi.energiaProducidaPorTurno;
        resultado.matBioConsumidoPorTurno   = edi.matBioConsumidoPorTurno;
        resultado.matBioProducidoPorTurno   = edi.matBioProducidoPorTurno;
        resultado.idSer             = edi.idSer;
        resultado.posX              = edi.posX;
        resultado.posY              = edi.posY;
        resultado.radioAccion       = edi.radioAccion;
        resultado.modelo            = getModeloSerializable(edi.tipo);
        resultado.tipo              = getTipoEdifSerializable(edi.tipo);
        resultado.eficiencia        = edi.eficiencia;
        resultado.numMetales        = edi.numMetales;
        resultado.matBioSinProcesar = edi.matBioSinProcesar;
        resultado.radioAccion       = edi.radioAccion;
        resultado.matrizRadioAccion = new List <Tupla <int, int, bool> >();
        for (int i = 0; i < edi.matrizRadioAccion.Count; i++)
        {
            Tupla <int, int, bool> tupla = new Tupla <int, int, bool>();
            tupla.e1 = edi.matrizRadioAccion[i].e1;
            tupla.e2 = edi.matrizRadioAccion[i].e2;
            tupla.e3 = edi.matrizRadioAccion[i].e3;
            resultado.matrizRadioAccion.Add(tupla);
        }
        return(resultado);
    }
Esempio n. 4
0
    private static Edificio getEdificioNoSerializable(Vida vida, EdificioSerializable edi)
    {
        int          idSer       = edi.idSer;
        TipoEdificio tipoEdif    = getTipoEdifNoSerializable(vida, edi.tipo);
        int          posX        = edi.posX;
        int          posY        = edi.posY;
        int          eneCons     = edi.energiaConsumidaPorTurno;
        int          compBaCons  = edi.compBasConsumidosPorTurno;
        int          compAvCons  = edi.compAvzConsumidosPorTurno;
        int          matBioCons  = edi.matBioConsumidoPorTurno;
        int          eneProd     = edi.energiaProducidaPorTurno;
        int          compBaProd  = edi.compBasProducidosPorTurno;
        int          compAvProd  = edi.compAvzProducidosPorTurno;
        int          matBioProd  = edi.matBioProducidoPorTurno;
        float        eficiencia  = edi.eficiencia;
        int          numMetales  = edi.numMetales;
        int          matBioSin   = edi.matBioSinProcesar;
        int          radioAccion = edi.radioAccion;
        List <Tupla <int, int, bool> > matrizRadioAccion = new List <Tupla <int, int, bool> >();

        for (int i = 0; i < edi.matrizRadioAccion.Count; i++)
        {
            Tupla <int, int, bool> tupla = new Tupla <int, int, bool>();
            tupla.e1 = edi.matrizRadioAccion[i].e1;
            tupla.e2 = edi.matrizRadioAccion[i].e2;
            tupla.e3 = edi.matrizRadioAccion[i].e3;
            matrizRadioAccion.Add(tupla);
        }
        GameObject modelo = getModeloNoSerializableReal(edi.modelo, vida.tablero[edi.posX, edi.posY].coordsVert);

        return(new Edificio(idSer, tipoEdif, posX, posY, eficiencia, numMetales, matrizRadioAccion, radioAccion, modelo, eneCons, compBaCons, compAvCons, matBioCons, eneProd, compBaProd, compAvProd, matBioProd, matBioSin));
    }
Esempio n. 5
0
        public Tupla buscar(Tabla tabla, ComparadorTuplas comparador)
        {
            FileStream archivo = null;

            //archivos.TryGetValue(tabla.getArchivo(), out archivo);
            archivo = new FileStream(tabla.getArchivo(),
                                     FileMode.OpenOrCreate,
                                     FileAccess.ReadWrite,
                                     FileShare.ReadWrite);
            IFormatter formatter = new BinaryFormatter();
            bool       encontre  = false;
            Tupla      tupla     = null;

            while (archivo.Position < archivo.Length && !encontre)
            {
                //Tupla aux = (Tupla)formatter.Deserialize(archivo);
                Tupla aux = leerYavanzar(archivo, tabla);
                if (aux != null && comparador(aux))
                {
                    tupla    = aux;
                    encontre = true;
                }
            }
            archivo.Close();
            //archivo.Position = 0;
            return(tupla);
        }
        /// <summary>
        /// Busca la persona indicada, hace out de null si no estaba.
        /// El return true, especifica que no hubo error, false que si lo hubo
        /// </summary>
        /// <param name="baseDeDatos">Base de datos usada</param>
        /// <param name="dni">Dni de la persona a buscar</param>
        /// <param name="persona">Aqui se devuelve la persona</param>
        /// <returns>False si hubo error, true si no lo hubo</returns>
        public Boolean buscarPersona(BaseDatos baseDeDatos, String dni, out Persona persona)
        {
            int intentos = 5;

            persona = null;
            Transaccion transaccion = null;

            while (transaccion == null && intentos > 0)
            {
                try
                {
                    transaccion = baseDeDatos.crearTransaccion();
                }
                catch (LimiteCantidadTransaccionesException)
                {
                    intentos--;
                }
            }
            if (transaccion != null)
            {
                intentos = 5;
                bool exito = false;
                while (intentos > 0 && !exito)
                {
                    try
                    {
                        List <Object> condicion = new List <object>();
                        condicion.Add(dni);
                        baseDeDatos.bloquear(transaccion,
                                             new CondicionPersona(0, dni),
                                             BaseDeDatos.ControlConcurrencia.TipoBloqueo.BLOQUEO_LECTURA);
                        Tupla tupla = baseDeDatos.buscar(new TablaPersona(), new Archivo.ComparadorTuplas(
                                                             delegate(Tupla t)
                        {
                            return(((Persona)t).Dni == dni);
                        }
                                                             ));
                        //si no estaba, retorna null, y si se castea, quiza levante error
                        if (tupla != null)
                        {
                            persona = (Persona)tupla;
                        }
                        baseDeDatos.commit(transaccion);
                        return(true);
                    }
                    catch (AbortarEsperarMorirException)
                    {
                        intentos--;
                        if (intentos > 0)
                        {
                            baseDeDatos.reiniciarTransaccin(transaccion);
                        }
                    }
                }
                return(false);
            }
            return(false);
        }
Esempio n. 7
0
        public void escribirEnRegistroTest()
        {
            Registro    target      = new Registro(); // TODO: Inicializar en un valor adecuado
            Transaccion transaccion = null;           // TODO: Inicializar en un valor adecuado
            Tabla       tabla       = null;           // TODO: Inicializar en un valor adecuado
            Tupla       dato        = null;           // TODO: Inicializar en un valor adecuado

            target.escribirEnRegistro(transaccion, tabla, dato);
            Assert.Inconclusive("Un método que no devuelve ningún valor no se puede comprobar.");
        }
Esempio n. 8
0
        public Tupla <T1, T2>[] Zip <T1, T2>(T1[] lista1, T2[] lista2)
        {
            Tupla <T1, T2>[] arreglo = new Tupla <T1, T2> [Longitud <T1, T2>(lista1, lista2)];

            for (int i = 0; i < arreglo.Length; i++)
            {
                arreglo[i] = new Tupla <T1, T2>(lista1[i], lista2[i]);
            }
            return(arreglo);
        }
Esempio n. 9
0
        public void escribirEnRegistro(Transaccion transaccion, Tabla tabla, Tupla dato)
        {
            lock (entradas)
            {
                EntradaRegistro ent = new EntradaEscribir(transaccion, tabla, dato);
                entradas.Add(ent);

                transaccion.agregarEntradaDeRegistro((EntradaEscribir)ent);
            }
        }
Esempio n. 10
0
        //retorno de un arreglo de tuplas
        public Tupla <T1, T2>[] Zip <T1, T2>(T1[] listaA, T2[] listaB)
        {
            Tupla <T1, T2>[] arreglo = new Tupla <T1, T2> [Longitud <T1, T2>(listaA, listaB)];

            //agregando valores al arreglo
            for (int i = 0; i < arreglo.Length; i++)
            {
                arreglo[i] = new Tupla <T1, T2>(listaA[i], listaB[i]);
            }
            return(arreglo);
        }
Esempio n. 11
0
    /* Construye un archivo con los datos del tablero Vida a partir de
     * unos datos serializables.
     */
    private static void rehacerVida(ref Vida vida, VidaSerializable vidaSerializable)
    {
        vida.idActualAnimal   = vidaSerializable.idActualAnimal;
        vida.idActualEdificio = vidaSerializable.idActualEdificio;
        vida.idActualVegetal  = vidaSerializable.idActualVegetal;

        vida.posicionesColindantes = new List <Tupla <int, int> >();
        for (int i = 0; i < vidaSerializable.posicionesColindantes.Count; i++)
        {
            Tupla <int, int> tupla = new Tupla <int, int>(vidaSerializable.posicionesColindantes[i].e1, vidaSerializable.posicionesColindantes[i].e2);
            vida.posicionesColindantes.Add(tupla);
        }
        rehacerTablero(vidaSerializable.tablero, ref vida.tablero);
    }
Esempio n. 12
0
    public void testZip()
    {
        // Arrange
        int[]    arr1 = new int[] { 1, 2, 3 };
        string[] arr2 = new string[] { "hola", "mundo" };

        Tupla <int, string>[] resultado = Program.Zip <int, string>(arr1, arr2);
        // El arreglo resultado debe ser [new Tupla(1,"hola"), new Tupla(2, "mundo")]

        Tupla <int, string> primer = resultado[0];

        Assert.Equal(1, primer.Primero);
        Assert.Equal("hola", primer.Segundo);
    }
Esempio n. 13
0
        private async Task <HashSet <Tupla> > GetComments(Contribution c)
        {
            HashSet <Tupla> comments = new HashSet <Tupla>();

            foreach (var com in c.Comments)
            {
                var com2 = await _context.Comments.Include(c2 => c2.Author).Include(c2 => c2.Comments).FirstOrDefaultAsync(c2 => c2.Id == com.Id);

                //_logger.LogInformation(com2.Content + " " + com2.Author.UserId);
                Tupla t = new Tupla();
                t.Parent   = com2;
                t.Children = await GetComments(com2);

                comments.Add(t);
            }
            return(comments);
        }
Esempio n. 14
0
        private Tupla leerYavanzar(FileStream archivo, Tabla tabla)
        {
            IFormatter formatter   = new BinaryFormatter();
            long       posAnterior = archivo.Position;

            try
            {
                Tupla t      = (Tupla)formatter.Deserialize(archivo);
                long  meMovi = archivo.Position - posAnterior;
                archivo.Position += tabla.getCantidadBytesRegistros() - meMovi;
                return(t);
            }
            catch (SerializationException e)
            {
                //si entro aqui, estoy leyendo algo que se está escribiendo
                //asi que de seguro no es un registro que busco. Me lo garantiza
                //es control de bloqueo. Lo que yo leo, no se está modificando.

                archivo.Position = posAnterior + tabla.getCantidadBytesRegistros();//abanzo al siguiente registro
                return(null);
            }
        }
        /// <summary>
        /// Escribe la persona en la base de datos (Agrega o modifica)
        /// <para>Puede levantar PersonaConDniYaExisteException</para>
        /// </summary>
        /// <param name="baseDeDatos">Base de datos usada</param>
        /// <param name="persona">Persona que se escribira</param>
        /// <returns>True si hubo exito, false en caso contrario</returns>
        public Boolean escribirPersona(BaseDatos baseDeDatos, Persona persona)
        {
            int         intentos    = 5;
            Transaccion transaccion = null;

            while (transaccion == null && intentos > 0)
            {
                try
                {
                    transaccion = baseDeDatos.crearTransaccion();
                }
                catch (LimiteCantidadTransaccionesException)
                {
                    intentos--;
                }
            }
            if (transaccion != null)
            {
                intentos = 5;
                bool exito = false;
                while (intentos > 0 && !exito)
                {
                    try
                    {
                        List <Object> condicion = new List <object>();
                        condicion.Add(persona.Dni);
                        baseDeDatos.bloquear(transaccion,
                                             new CondicionPersona(0, persona.Dni),
                                             BaseDeDatos.ControlConcurrencia.TipoBloqueo.BLOQUEO_ESCRITURA);

                        /*
                         * Compruebo que no exista el dni
                         */
                        Tupla tupla = baseDeDatos.buscar(new TablaPersona(), new Archivo.ComparadorTuplas(
                                                             delegate(Tupla t)
                        {
                            Persona p = (Persona)t;
                            return(p.Dni == persona.Dni && p.Id != persona.Id);  //si es igual id, es modificacion
                        }
                                                             ));
                        if (tupla != null)
                        {
                            baseDeDatos.abortarTransaccion(transaccion, new PersonaConDniYaExisteException().Message);
                            throw new PersonaConDniYaExisteException();
                        }


                        baseDeDatos.escribir(transaccion, new TablaPersona(), persona);
                        baseDeDatos.commit(transaccion);
                        exito = true;
                    }
                    catch (AbortarEsperarMorirException)
                    {
                        intentos--;
                        if (intentos > 0)
                        {
                            baseDeDatos.reiniciarTransaccin(transaccion);
                        }
                    }
                }
                return(exito);
            }
            return(false);
        }
 public EntradaEscribir(Transaccion transaccion, Tabla tabla, Tupla dato)
     : base(transaccion.Id)
 {
     this.tabla = tabla;
     this.dato  = dato;
 }
Esempio n. 17
0
 public void escribir(Transaccion transaccion, Tabla tabla, Tupla dato)
 {
     dato.asignarID();
     registro.escribirEnRegistro(transaccion, tabla, dato);
 }
Esempio n. 18
0
        public void escribir(Tabla tabla, Tupla dato)
        {
            FileStream archivo = null;

            //archivos.TryGetValue(tabla.getArchivo(), out archivo);
            archivo = new FileStream(tabla.getArchivo(),
                                     FileMode.OpenOrCreate,
                                     FileAccess.ReadWrite,
                                     FileShare.ReadWrite);
            IFormatter formatter = new BinaryFormatter();

            if (dato.getId() >= tabla.getSiguienteIdDisponible())
            {
                //es id nuevo, inserta
                lock (semaforoInsertar)
                {
                    archivo.Position = archivo.Length;
                    long posicionAnterior = archivo.Position;
                    tabla.guardarUltimoId(dato.getId());
                    formatter.Serialize(archivo, dato);
                    //cada registro ocupa un maximo (Es estatico, si no hago esto es dinamico)
                    //asi q agrego tantos byte como falten
                    long cantidadQuefalta = tabla.getCantidadBytesRegistros() - (archivo.Position - posicionAnterior);
                    archivo.Write(new byte[cantidadQuefalta], 0, (int)cantidadQuefalta);
                }
            }
            else
            {
                //modificacion
                Tupla t = null;
                //si o si va a estar, pues se usa borrado logico
                //pero puede no estar, si se está haciendo restauracion
                long posicion = 0;
                if (archivo.Position < archivo.Length)
                {
                    posicion = archivo.Position;
                    t        = leerYavanzar(archivo, tabla);
                }

                while (archivo.Position < archivo.Length && t.getId() != dato.getId())
                {
                    posicion = archivo.Position;
                    t        = leerYavanzar(archivo, tabla);
                }

                if (t == null || t.getId() != dato.getId())
                {
                    //no estaba
                    posicion = archivo.Length;
                    lock (semaforoInsertar)//lock para insertar
                    {
                        long posicionAnterior = archivo.Position;
                        formatter.Serialize(archivo, dato);
                        //cada registro ocupa un maximo (Es estatico, si no hago esto es dinamico)
                        //asi q agrego tantos byte como falten
                        long cantidadQuefalta = tabla.getCantidadBytesRegistros() -
                                                (archivo.Position - posicionAnterior);
                        archivo.Write(new byte[cantidadQuefalta], 0, (int)cantidadQuefalta);
                    }
                }
                else
                {
                    //estaba
                    archivo.Position = posicion;

                    long posicionAnterior = archivo.Position;
                    formatter.Serialize(archivo, dato);
                    //cada registro ocupa un maximo (Es estatico, si no hago esto es dinamico)
                    //asi q agrego tantos byte como falten
                    long cantidadQuefalta = tabla.getCantidadBytesRegistros() -
                                            (archivo.Position - posicionAnterior);
                    archivo.Write(new byte[cantidadQuefalta], 0, (int)cantidadQuefalta);
                }
            }

            archivo.Flush();
            archivo.Close();
            //archivo.Position = 0;
        }
Esempio n. 19
0
    /* Construye un archivo con los datos del tablero Vida a partir de
     * unos datos serializables.
     */
    private static void rehacerVida(ref Vida vida, VidaSerializable vidaSerializable)
    {
        vida.idActualAnimal = vidaSerializable.idActualAnimal;
        vida.idActualEdificio = vidaSerializable.idActualEdificio;
        vida.idActualVegetal = vidaSerializable.idActualVegetal;

        vida.posicionesColindantes = new List<Tupla<int,int>>();
        for (int i = 0; i < vidaSerializable.posicionesColindantes.Count; i++) {
            Tupla<int,int> tupla = new Tupla<int, int>(vidaSerializable.posicionesColindantes[i].e1, vidaSerializable.posicionesColindantes[i].e2);
            vida.posicionesColindantes.Add(tupla);
        }
        rehacerTablero(vidaSerializable.tablero, ref vida.tablero);
    }
Esempio n. 20
0
    /* Construye un archivo con los datos de la clase Vida que es serializable
     * a partir de unos datos de Vida no serializables.
     */
    private static void generarVidaSerializable(Vida vida, ref VidaSerializable vidaSerializable)
    {
        vidaSerializable = new VidaSerializable();
        vidaSerializable.animales = new List<AnimalSerializable>();
        for (int i = 0; i < vida.animales.Count; i++) {
            vidaSerializable.animales.Add(getAnimalSerializable(vida.animales[i]));
        }
        vidaSerializable.vegetales = new List<VegetalSerializable>();
        for (int i = 0; i < vida.vegetales.Count; i++) {
            vidaSerializable.vegetales.Add(getVegetalSerializable(vida.vegetales[i]));
        }
        vidaSerializable.edificios = new List<EdificioSerializable>();
        for (int i = 0; i < vida.edificios.Count; i++) {
            vidaSerializable.edificios.Add(getEdificioSerializable(vida.edificios[i]));
        }
        vidaSerializable.idActualAnimal = vida.idActualAnimal;
        vidaSerializable.idActualEdificio = vida.idActualEdificio;
        vidaSerializable.idActualVegetal = vida.idActualVegetal;

        vidaSerializable.posicionesColindantes = new List<Tupla<int,int>>();
        for (int i = 0; i < vida.posicionesColindantes.Count; i++) {
            Tupla<int,int> tupla = new Tupla<int, int>(vida.posicionesColindantes[i].e1, vida.posicionesColindantes[i].e2);
            vidaSerializable.posicionesColindantes.Add(tupla);
        }

        generarTableroSerializable(vida.tablero, ref vidaSerializable.tablero);
    }
Esempio n. 21
0
 private static EdificioSerializable getEdificioSerializable(Edificio edi)
 {
     EdificioSerializable resultado = new EdificioSerializable();
     resultado.compAvzConsumidosPorTurno = edi.compAvzConsumidosPorTurno;
     resultado.compAvzProducidosPorTurno = edi.compAvzProducidosPorTurno;
     resultado.compBasConsumidosPorTurno = edi.compBasConsumidosPorTurno;
     resultado.compBasProducidosPorTurno = edi.compBasProducidosPorTurno;
     resultado.energiaConsumidaPorTurno = edi.energiaConsumidaPorTurno;
     resultado.energiaProducidaPorTurno = edi.energiaProducidaPorTurno;
     resultado.matBioConsumidoPorTurno = edi.matBioConsumidoPorTurno;
     resultado.matBioProducidoPorTurno = edi.matBioProducidoPorTurno;
     resultado.idSer = edi.idSer;
     resultado.posX = edi.posX;
     resultado.posY = edi.posY;
     resultado.radioAccion = edi.radioAccion;
     resultado.modelo = getModeloSerializable(edi.tipo);
     resultado.tipo = getTipoEdifSerializable(edi.tipo);
     resultado.eficiencia = edi.eficiencia;
     resultado.numMetales = edi.numMetales;
     resultado.matBioSinProcesar = edi.matBioSinProcesar;
     resultado.radioAccion = edi.radioAccion;
     resultado.matrizRadioAccion = new List<Tupla<int, int, bool>>();
     for (int i = 0; i < edi.matrizRadioAccion.Count; i++) {
         Tupla<int, int, bool> tupla = new Tupla<int, int, bool>();
         tupla.e1 = edi.matrizRadioAccion[i].e1;
         tupla.e2 = edi.matrizRadioAccion[i].e2;
         tupla.e3 = edi.matrizRadioAccion[i].e3;
         resultado.matrizRadioAccion.Add(tupla);
     }
     return resultado;
 }
Esempio n. 22
0
 private static Edificio getEdificioNoSerializable(Vida vida, EdificioSerializable edi)
 {
     int idSer = edi.idSer;
     TipoEdificio tipoEdif = getTipoEdifNoSerializable(vida, edi.tipo);
     int posX = edi.posX;
     int posY = edi.posY;
     int eneCons = edi.energiaConsumidaPorTurno;
     int compBaCons = edi.compBasConsumidosPorTurno;
     int compAvCons = edi.compAvzConsumidosPorTurno;
     int matBioCons = edi.matBioConsumidoPorTurno;
     int eneProd = edi.energiaProducidaPorTurno;
     int compBaProd = edi.compBasProducidosPorTurno;
     int compAvProd = edi.compAvzProducidosPorTurno;
     int matBioProd = edi.matBioProducidoPorTurno;
     float eficiencia = edi.eficiencia;
     int numMetales = edi.numMetales;
     int matBioSin = edi.matBioSinProcesar;
     int radioAccion = edi.radioAccion;
     List<Tupla<int, int, bool>> matrizRadioAccion = new List<Tupla<int, int, bool>>();
     for (int i = 0; i < edi.matrizRadioAccion.Count; i++) {
         Tupla<int, int, bool> tupla = new Tupla<int, int, bool>();
         tupla.e1 = edi.matrizRadioAccion[i].e1;
         tupla.e2 = edi.matrizRadioAccion[i].e2;
         tupla.e3 = edi.matrizRadioAccion[i].e3;
         matrizRadioAccion.Add(tupla);
     }
     GameObject modelo = getModeloNoSerializableReal(edi.modelo, vida.tablero[edi.posX, edi.posY].coordsVert);
     return new Edificio(idSer, tipoEdif, posX, posY, eficiencia, numMetales, matrizRadioAccion, radioAccion, modelo, eneCons, compBaCons, compAvCons, matBioCons, eneProd, compBaProd, compAvProd, matBioProd, matBioSin);
 }