IIC2233 / Syllabus-2024-1

79 stars 11 forks source link

¿Modificar bytes no afecta al resultado de desserializar? #542

Open Vicente1824 opened 3 months ago

Vicente1824 commented 3 months ago

Prerrequisitos

(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")

Duda

Estaba haciendo la tarea 4, en la parte de codificar la solución, y mientras lo hacía me di cuenta de esto que pasa con los bytes. Si yo tengo, por, ejemplo, una lista, la serializo, y luego la desserializo, obtengo la misma lista; entonces, si yo serializo una lista, pero esta vez la modifico añadiéndole cosas (más bytes de cualquier tipo), y luego la desserializo, solo podría esperar que pasen 2 cosas: o falla, o me entrega una lista diferente como resultado. Pero no fue así: al desserializar, me entregó la misma lista entregada originalmente. Adjunto ejemplo aquí:

from pickle import dumps, loads

lista = [0, 1, 2, 3, 4, 5]
lista_serializada = bytearray(dumps(lista))
print(lista_serializada)
lista_serializada.append(4)
print(lista_serializada)
lista_deserializada = loads(bytes(lista_serializada))
print(lista_deserializada)

Y el output fue:

bytearray(b'\x80\x04\x95\x11\x00\x00\x00\x00\x00\x00\x00]\x94(K\x00K\x01K\x02K\x03K\x04K\x05e.')
bytearray(b'\x80\x04\x95\x11\x00\x00\x00\x00\x00\x00\x00]\x94(K\x00K\x01K\x02K\x03K\x04K\x05e.\x04')
[0, 1, 2, 3, 4, 5]

En la segunda línea de output se puede ver que el bytearray ahora tiene un byte más, pero a pesar de eso obtengo la lista original, ¿por qué añadir bytes no modifica el resultado? ¿Estoy haciendo algo mal o qué es lo que pasa? ¿Eso quiere decir que podría añadir cosas a mis elementos serializados y nunca me dará problemas? Haciendo más pruebas, incluso noté que puedo modificar algunos bytes de mi elemento serializado y seguirá funcionando (si modifico muchos, la función loads empieza a tirar errores).

PD: Ya logré resolver mi problema en la tarea, hago esta pregunta por curiosidad porque no entiendo muy bien los bytes.

AAromero1 commented 3 months ago

Hola @Vicente1824.

Esto sucede dado que al serializar con pickle especificamente al finalizar agrega un marcador 'e' . Indicando que cuando le hagas una deserialización, se ignoran los caracteres despues del marcador. Pero si agregas entremedio algunos bytes podrias o no obtenen un error, dado que eso dependera del algoritmo que utilize la libreria. Espero haya respondido tu duda