serialized serialize serializacion deserialize deserializacion and c# serialization stream

c# - serialize - ¿Por qué la mayoría de los serializadores usan una secuencia en lugar de una matriz de bytes?



serialization c# (5)

Actualmente estoy trabajando en un servidor de socket y me preguntaba ¿Por qué los serializadores les gusta

todos requieren una Stream lugar de una matriz de bytes?


La respuesta de @JoSkeet es la correcta, pero como una adición, si el problema que está teniendo al hacer una transmisión temporal es "No me gusta porque es un esfuerzo", entonces considere escribir un método de extensión:

namespace Project.Extensions { public static class XmlSerialiserExtensions { public static void Serialise(this XmlSerializer serialiser, byte[] bytes, object obj) { using(var temp = new MemoryStream(bytes)) serialiser.Serialize(temp, obj); } public static object Deserialise(this XmlSerializer serialiser, byte[] bytes) { using(var temp = new MemoryStream(bytes)) return serialiser.Deserialize(temp); } } }

Entonces puedes continuar y hacer

serialiser.Serialise(buffer, obj); socket.Write(buffer);

O

socket.Read(buffer); var obj = serialiser.Deserialise(buffer);


Los arrays de bytes se usaron más a menudo cuando se manipulaban cadenas de caracteres ASCII (es decir, 1 byte) a menudo en aplicaciones dependientes de la máquina, como los buffers. Se prestan más a aplicaciones de bajo nivel, mientras que "streams" es una forma más generalizada de tratar con datos, lo que permite una gama más amplia de aplicaciones. Además, las transmisiones son una forma más abstracta de mirar datos, lo que permite que consideraciones tales como el tipo de carácter (UTF-8, UTF-16, ASCII, etc.) sean manejadas por código que es invisible para el usuario de la secuencia de datos.


Puede hacer fácilmente una secuencia sobre una matriz de bytes ... pero una matriz de bytes tiene restricciones de tamaño inherentes, donde la secuencia es abierta ... tan grande como lo necesite. Algunas serializaciones pueden ser bastante enormes.

Editar : Además, si necesito implementar algún tipo de serialización, quiero hacerlo para la abstracción más básica, y evitar tener que hacerlo sobre múltiples abstracciones. Stream sería mi elección, ya que hay implementaciones de flujo en muchas cosas: memoria, disco, red, etc. Como implementador, obtengo esos para "gratis".


Significa que puede transmitir a destinos arbitrarios en lugar de solo a la memoria.

Si desea escribir algo en un archivo, ¿por qué querría crear primero una copia completa en la memoria? En algunos casos, eso podría ocasionar que use mucha memoria extra, posiblemente causando una falla.

Si desea crear una matriz de bytes, solo use un MemoryStream :

var memoryStream = new MemoryStream(); serializer.Write(foo, memoryStream); // Or whatever you''re using var bytes = memoryStream.ToArray();

Entonces, con una abstracción de "usted usa streams", puede trabajar fácilmente con la memoria, pero si la abstracción es "usa una matriz de bytes", se verá forzado a trabajar con la memoria, incluso si no lo desea.


si usa una byte array/ buffer , está trabajando temporalmente en la memoria y tiene un tamaño limitado

Mientras que una transmisión es algo que le permite almacenar cosas en el disco, envíe a otras computadoras como internet, puerto serie, etc. las transmisiones a menudo usan búferes para optimizar la velocidad de transmisión.

Entonces, la transmisión será útil si se trata de un archivo grande