Jump to content
Tizon

Serialización. Listas y objetos

Recommended Posts

Hola,

Pues sigo aprendiendo y practicando. Esencialmente me gustaría preguntar si alguien conoce un buen manual o tutorial sobre serialización, especialmente dirigido hacia la parte de listas y referencias a objetos, que es dónde la estoy liando bonita. Me gustaría que fuera más práctico y por conceptos, más que nada para saber cuando y como es coherente serializar, ya que creo que tengo malas costumbres del C++ y estoy dando cosas por supuestas erróneamente. He pegado una vuelta a las ayudas de microsoft y las cosas que salen a bote pronto googleando, pero lo que me sale no profundiza mucho y no me resuelve mis dudas de fondo.

Y ya que estoy, aprovecho para preguntar una de mis dudas. Cuando creo un objeto y lo añado con un add a una lista, entiendo que no se crea una copia del objeto a la lista, sino una referencia al objeto original. Alguien puede confirmármelo?

Y siguiendo con mis dudas, si no es abusar, planteo el caso que me atormenta ahora mismo. Para que os situéis es un juego de estrategia naval. Creo una clase arma, dónde figuran tiempos de recarga, cadencia de disparo, consumo de munición, alcance máximo etc. Para poner un ejemplo, un antiaeréo de 20mm. Para calcular su impacto, creo otra clase dónde se marca distancia, probabilidad, penetración... Siguiendo con el ejemplo, a 500 metros tiene una probabilidad de un 5% de acertar y atraviesa 20mm de blindaje, a 1000 un 2% y atraviesa sólo 5mm. Esto lo añado al arma con una lista. Después creo una clase torreta, dónde según el tipo de arma podrá tener montajes simples, dobles, triples, cuadruples, sextuples, octuples. Esto tiene sentido sobre todo al pensar en montajes antiareos complejos o en las piezas principales, ya que tienen blindaje, velocidad de rotación y recarga más lentos, pero incrementa las posibilidades de impacto. Más si luego que pensamos que cada torre tendrá una ubicación y la de proa podrá disparar a proa, estribor y babor, pero una pieza en estribor sólo a proa estribor y popa, que una torreta montada más atrasada sobre otra sufrirá una penalización en velocidad de rotación y en efectividad o que una batería secundaria puesta al lado de una mayor sólo podrá abrir fuego defensivo por ejemplo a proa y estribor... Bien, me lío. El caso es que a la clase torreta sólo le añado una referencia al objeto arma, ya que tenga una, dos, tres u ocho piezas, siempre serán del mismo tipo. Hasta aquí bien. Luego creo una clase contenedora (Una mala costumbre del C++, hecho de menos el main) donde creo las tres listas de objetos de armas, puntería y torretas, y asigno a cada arma sus tablas de puntería, y a cada torreta la arma que le corresponde. Y serializo. Y ahí es dónde me lía el pitosfio. Al ver la serialización tengo toda la tabla de puntería, luego toda la tabla de armas y toda la tabla de torretas. Ahora bien, al abrir las armas, veo que también me ha serializado en su interior toda la tabla de puntería. Bueno, eso no es muy grave, podría cargarme la tabla que las agrupa todas las punterías, ya que pensando, resulta redundante. Ahora, el trauma me viene con las torretas, no sólo me guarda la referencia, sino el objeto entero, es decir, el arma y todas las tablas de puntería del arma. Y aquí la primera de mis cuestiones. Entiendo que al deserializar, no me crearía un objeto arma, como tengo en origen, sino un objeto arma por cada tipo de torreta, lo cual es un desperdicio de memoria en objetos duplicados, cuadriplicados e incluso más. Lo ideal sería que existiera un comando que indicara que sólo es una referencia, no un objeto en si (He buscado, pero o no existe o no he sabido encontrarlo). Se me ocurren dos soluciones, a no ser que alguien más experimentado me apunte una tercera. La primera sería serializar sólo las colecciones enteras sin las referencias entre objetos, añadiéndoles un ID y reconstruyendo después las referencias a través por ejemplo de LINQ (Entiendo que Unity lo implementa, una solución muy SQL, lo reconozco). La segunda cambiar la jerarquía y hacer que las torretas dependan del arma (Es decir, una lista en el propio arma) ya que un arma podrá estar montada en diferentes tipos de torretas, en cambio una torreta sólo tendrá una o más armas siempre del mismo tipo, pero como concepto me choca. A vosotros que os parece mejor solución?

En fin, que pregunto más cuestiones de concepto que de implementación. Perdón si pregunto burradas, pero es que lo encuentro googleando se centra más en la implementación que en los conceptos, que seguramente es dónde más fallo.

Perdón por el tocho y gracias nuevamente a todos.

Share this post


Link to post
Share on other sites

Perfecto, por eso me encanta preguntar. Siempre me descubrís algo nuevo que aprender.

Con esas dos cosas ya me has ayudado un montón. Muchas gracias, Braltor.

Share this post


Link to post
Share on other sites

Yo lo que hago (en una app actualmente) es una bbdd relacional pura, luego recupero los datos desnormalizados (3a forma normal) hasta cierto punto, agrupándolos en entidades independientes. Luego en C# los recupero por JSON, los guardo en una bbdd local de SQLLite que contiene exactamente las mismas entidades recuperadas y creo HashTables que apuntan a las tablas devolviendo IEnumerators. En el código juego con ellos para combinar los datos con LINQ, sobretodo con extensiones prehechas en las mismas clases que las creadas para el SQLLite. A mí me va de muerte.

Share this post


Link to post
Share on other sites

Sólo por curiosidad, por qué la serialización? Para guardar los datos de los barcos? Para un juego en red?

Un poco de todo, pero esencialmente por operativa. El año en que consiga acabarlo, si es que consigo, jejejejejejeje... habrá un plano general en el que será el plano estratégico, dónde habrán miles de barcos moviéndose, agrupados en task forces, combois y flotas. Esta parte será por turnos, y sólo tendré en cuenta agrupaciones, mientras que los combates serán en tiempo real y sólo aparecerán los buques afectados. Pero aparte de eso, considera controlar miles de barcos, teniendo en cuenta las distancias, las armas... Exigiría una bestia de máquina y un montón de operaciones cada vez... Aunque para cuando lo acabe, seguramente será una miseria para las máquinas de entonces, pero bueno. En realidad cuento con calcular una vez la velocidad, carga etc de una agrupación de buques y mover solamente la agrupación, recuperando los buques individuales únicamente cuando haga falta... Sino, pues sería una locura.

Yo lo que hago (en una app actualmente) es una bbdd relacional pura, luego recupero los datos desnormalizados (3a forma normal) hasta cierto punto, agrupándolos en entidades independientes. Luego en C# los recupero por JSON, los guardo en una bbdd local de SQLLite que contiene exactamente las mismas entidades recuperadas y creo HashTables que apuntan a las tablas devolviendo IEnumerators. En el código juego con ellos para combinar los datos con LINQ, sobretodo con extensiones prehechas en las mismas clases que las creadas para el SQLLite. A mí me va de muerte.

Buffff... me falta mucha información, muchos codos y muchas prácticas para llegar a eso... Aunque con tiempo y una caña todo se anda... pero de momento me conformo con ir avanzando cada día un poco más... Aún hay muchas novedades (para mi) que estoy tratando de comprender bien.

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...