# data[].attributes.body
Presentado por: Leonardo Espinoza Mier y Eduardo Juárez Cruz

# data[].attributes.body
En C++, los flujos de texto (o streams de texto) son una abstracción que permite realizar operaciones de entrada y salida (E/S) de datos de manera secuencial, especialmente con datos en forma de texto. Son parte de la biblioteca estándar y permiten trabajar con dispositivos como la consola, archivos, cadenas de texto, etc.

Tipos principales de flujos de texto en C++

# data[].attributes.body
1. Entrada estándar:
std::cin
Se usa para leer datos desde la consola (teclado).

2. Salida estándar:
std::cout
Se usa para imprimir datos en la consola (pantalla).

3. Salida de error:
std::cerr
Se usa para imprimir mensajes de error.

# data[].attributes.body
Flujos de archivo (texto):

std::ifstream: para leer archivos de texto.

std::ofstream: para escribir archivos de texto.

std::fstream: para leer y escribir archivos de texto.

Flujos con cadenas de texto:

std::istringstream: para leer desde una cadena de texto.

std::ostringstream: para escribir en una cadena de texto.

std::stringstream: para leer y escribir en una cadena de texto.

# data[].attributes.body
La función getline() se utiliza para leer una línea completa desde un flujo de entrada, como std::cin o un archivo. Es muy útil cuando necesitas capturar texto que contiene espacios.

# data[].attributes.body
Los flujos de entrada y salida en C++ son objetos diseñados para facilitar la transferencia de datos hacia y desde los programas. A través de operadores o funciones específicas, estos flujos permiten interactuar de manera estructurada y segura con dispositivos de entrada, como el teclado, y de salida, como la pantalla.

# data[].attributes.wish_content.attachment_props.question
¿Qué formato de serialización es más comúnmente utilizado para intercambiar datos entre un servidor y un cliente web?

# data[].attributes.headline
Serilizacion y Deserializacion de objetos

# data[].attributes.subject
Serilizacion y Deserializacion de objetos

# data[].attributes.body
Serialización es el proceso de convertir un objeto en un formato que pueda ser almacenado (por ejemplo, en un archivo) o transmitido (por ejemplo, por red).
Deserialización es el proceso inverso: reconstruir el objeto original a partir de ese formato.

Esto es útil cuando quieres guardar el estado de un objeto para usarlo más tarde.

# data[].attributes.headline
❌ Casos donde sería un error usar flujo de texto:

# data[].attributes.subject
❌ Casos donde sería un error usar flujo de texto:

# data[].attributes.body
1. Archivos que contienen datos no textuales, como:

Imágenes (JPG, PNG)

Audio (MP3, WAV)

Vídeo (MP4)

Archivos comprimidos (ZIP, RAR)

Archivos ejecutables (EXE)

# data[].attributes.body
2.- Estructuras de datos en memoria (como structs u objetos) que contienen datos en formatos exactos (por ejemplo, enteros, flotantes en representación binaria). Al guardar como texto:

Puede perder precisión (por ejemplo, con float o double)

Se puede alterar el tamaño o interpretación de los datos

# data[].attributes.body
3.-Cuando se requiere eficiencia en tamaño o velocidad:

El binario ocupa menos espacio y es más rápido de leer/escribir que el texto formateado.

# data[].attributes.headline
⚠️ Problemas al deserializar con cambios en la definición:

# data[].attributes.subject
⚠️ Problemas al deserializar con cambios en la definición:

# data[].attributes.body
1.-Desajuste en tamaño de los datos
Si se añadieron o eliminaron atributos, el tamaño del objeto ya no coincide con el esperado al leer desde el archivo binario. Esto puede provocar:

Lectura incompleta o corrupta.

Acceso a datos incorrectos o memoria basura.

# data[].attributes.body
2.-Cambio en el orden de los atributos
Si se reordenan los atributos, los valores deserializados ya no corresponden al campo correcto, lo que lleva a:

Inconsistencias lógicas.

Comportamiento inesperado del programa.

# data[].attributes.body
3.-Campos faltantes o adicionales

Si un atributo nuevo fue añadido, al deserializar no se inicializa (queda con un valor basura).

Si un atributo fue eliminado, los datos quedan sobrando, lo que puede llevar a errores de lectura.

# data[].attributes.body
4.-Riesgos de seguridad
-Datos malinterpretados pueden abrir vulnerabilidades, especialmente si el objeto es usado en decisiones de lógica crítica.

# data[].attributes.attachment_link.title
Tarjeta Horizontal Feliz Cumpleaños Divertido Colorido (1)

# data[].attributes.body
Facilidad de uso y legibilidad
Usar cin y cout es más intuitivo y legible, especialmente con tipos de datos simples.

Sobrecarga de operadores
Permite personalizar cómo se leen y escriben objetos, usando >> y <<, lo que mejora la integración con tipos definidos por el usuario.

Portabilidad y consistencia
Los flujos funcionan de manera consistente en diferentes sistemas operativos y permiten manejar tanto consola como archivos con una interfaz unificada.

# data[].attributes.body
Rendimiento relativamente bajo
Las operaciones con cin y cout suelen ser más lentas que las funciones tradicionales de C (scanf y printf), lo que puede ser un problema en programas donde el rendimiento es crítico.

Sintaxis menos flexible para formatos complejos
Aunque el sistema de flujos es poderoso, no es tan flexible ni directo como printf para realizar formatos complejos, como la alineación precisa de texto o la conversión de datos a formatos binarios/hexadecimales.

Manejo de errores menos claro
El manejo de errores con flujos de entrada y salida en C++ no es tan intuitivo. Necesitas verificar explícitamente el estado del flujo (usando fail(), eof(), etc.), lo cual puede ser confuso para los principiantes.

# data[].attributes.body
1. Persistencia de datos

La serialización permite guardar el estado de los objetos en un formato que puede almacenarse en archivos o bases de datos.

2. Interoperabilidad entre sistemas

La serialización permite transferir objetos entre diferentes sistemas o aplicaciones, incluso si están escritos en distintos lenguajes de programación, siempre que ambos sistemas usen el mismo formato de serialización (como JSON, XML, o un formato binario).

3. Facilidad en la transmisión de datos complejos

La serialización convierte los objetos en una secuencia de bytes (o formato legible) que puede ser fácilmente transmitida a través de redes, almacenamiento en disco, o entre procesos.

# data[].attributes.headline
Desventajas de la serializacion de objetos

# data[].attributes.subject
Desventajas de la serializacion de objetos

# data[].attributes.body
1. Rendimiento

La serialización y deserialización de objetos puede ser costosa en términos de rendimiento, especialmente cuando se trabajan con grandes cantidades de datos o estructuras de objetos complejas.

2. Dependencia de formato y versión

Los datos serializados dependen del formato en el que se guardaron (por ejemplo, XML, JSON, binario). Si el formato cambia o la estructura de los objetos se modifica, la deserialización puede fallar o generar errores.

3. Complejidad adicional

La implementación de la serialización, especialmente si no se usan bibliotecas específicas, puede aumentar la complejidad del código.

# data[].attributes.body
Material audiovisual: Flujo de Entrada/Salida

# data[].attributes.attachment_link.title
Flujo de entrada y salida estandar en C++ (std::cout, std::cin)

# data[].attributes.body
Material audiovisual: Serializacion de objetos

# data[].attributes.wish_content.attachment_props.question
¿Cuál es la diferencia principal entre cin y getline al leer datos en C++?

# data[].attributes.wish_content.attachment_props.poll_choices[].choice_text
A) cin puede leer cadenas con espacios, mientras que getline no.

# data[].attributes.wish_content.attachment_props.poll_choices[].choice_text
B) getline lee toda una línea de texto, incluyendo espacios, mientras que cin se detiene en el primer espacio.

# data[].attributes.wish_content.attachment_props.poll_choices[].choice_text
C) No hay ninguna diferencia, ambos se usan de la misma forma.

# data[].attributes.body
cplusplus.com. (n.d.). Files. https://cplusplus.com/doc/tutorial/files/

Wikilibros. (n.d.). Programación en C++/Flujos de entrada y salida. https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Flujos_de_entrada_y_salida

GeeksforGeeks. (n.d.). Serialize and deserialize an object in C++. https://www.geeksforgeeks.org/serialize-and-deserialize-an-object-in-cpp/

DelftStack. (n.d.). Biblioteca de serialización en C++. https://www.delftstack.com/es/howto/cpp/cpp-serialization-library/

CodeGuru. (n.d.). An introduction to object serialization in C++. https://www.codeguru.com/cplusplus/an-introduction-to-object-serialization-in-c/