31 votes

Pourquoi la plupart des sérialiseurs utilisent-ils un flux au lieu d'un tableau d'octets?

Je suis actuellement en train de travailler sur un socket serveur et je me demandais Pourquoi ne sérialiseurs comme

tous besoin d'un Flux au lieu d'un tableau d'octets?

51voto

Jon Skeet Points 692016

Cela signifie que vous pouvez diffuser à l'arbitraire destinations, plutôt que juste pour mémoire.

Si vous voulez écrire quelque chose dans un fichier, pourquoi voulez-vous créer une copie dans la mémoire de la première? Dans certains cas, cela pourrait vous amener à utiliser beaucoup de mémoire supplémentaire, éventuellement à l'origine d'un échec.

Si vous souhaitez créer un tableau d'octets, il suffit d'utiliser un MemoryStream:

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

Donc, avec une abstraction de "vous utiliser les flux", vous pouvez facilement travailler avec la mémoire, mais si l'abstraction est "vous utilisez un tableau d'octets" vous êtes obligé de travailler avec la mémoire même si vous ne le souhaitez pas.

11voto

Clay Points 2591

Vous pouvez facilement faire un stream sur un tableau d'octets...mais un tableau d'octets est, intrinsèquement, de taille limitée, d'où un flux de données est ouverte...grand que vous avez besoin. Certains de sérialisation peut être assez énorme.

Edit: et Aussi, si j'ai besoin d'implémenter une sorte de sérialisation, je veux le faire le plus fondamental de l'abstraction, et éviter d'avoir à le faire sur plusieurs abstractions. Volet serait mon choix, car il existe des flux implémentations plus de beaucoup de choses: de mémoire, disque, réseau, et ainsi de suite. Comme un maître d'oeuvre, je reçois ces "free".

5voto

BRAHIM Kamel Points 10043

si vous utilisez un byte array/ buffer vous travaillez temporairement en mémoire et votre taille est limitée

Alors qu'un flux est quelque chose qui vous permet de stocker des choses sur le disque, de les envoyer à d'autres ordinateurs tels qu'Internet, un port série, etc., les flux utilisent souvent des tampons pour optimiser la vitesse de transmission.

Le streaming sera donc utile si vous avez affaire à un gros fichier

1voto

Pharap Points 804

@ La réponse de JonSkeet est la bonne, mais en complément, si le problème que vous rencontrez avec la création d'un flux temporaire est "Je ne l'aime pas parce que c'est un effort", alors envisagez d'écrire une méthode d'extension:

 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);
        }
    }
}
 

Vous pouvez donc aller de l'avant et faire

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

Ou

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

-3voto

John Points 7

Tableaux d'octets ont été utilisés le plus souvent lors de la manipulation de l'ASCII (c'est à dire 1 octet) les chaînes de caractères sont souvent à la machine, les applications qui en dépendent, tels que des tampons. Ils se prêtent plus faible au niveau des applications, alors que le "flux" est plus généralisée de la façon de traiter avec les données, ce qui permet à un plus large éventail d'applications. Aussi, les flux sont une manière plus abstraite de regarder les données, ce qui permet à des considérations telles que le type de caractères (UTF-8, UTF-16, ASCII, etc.) pour être manipulé par un code qui est invisible pour l'utilisateur du flux de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X