233 votes

Conversion de Stream en String et inversement... qu'est-ce qui nous manque ?

Je veux sérialiser des objets en chaînes de caractères, et inversement.

Nous utilisons protobuf-net pour transformer un objet en Stream et inversement, avec succès.

Cependant, Stream à la ficelle et retour... pas très réussi. Après être passé par StreamToString y StringToStream le nouveau Stream n'est pas désérialisée par protobuf-net ; elle soulève un Arithmetic Operation resulted in an Overflow exception. Si nous désérialisons le flux original, cela fonctionne.

Nos méthodes :

public static string StreamToString(Stream stream)
{
    stream.Position = 0;
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
    {
        return reader.ReadToEnd();
    }
}

public static Stream StringToStream(string src)
{
    byte[] byteArray = Encoding.UTF8.GetBytes(src);
    return new MemoryStream(byteArray);
}

Notre exemple de code utilise ces deux :

MemoryStream stream = new MemoryStream();
Serializer.Serialize<SuperExample>(stream, test);
stream.Position = 0;
string strout = StreamToString(stream);
MemoryStream result = (MemoryStream)StringToStream(strout);
var other = Serializer.Deserialize<SuperExample>(result);

2voto

Steztric Points 577

J'ai écrit une méthode utile pour appeler n'importe quelle action qui prend un StreamWriter et l'écrire dans une chaîne à la place. La méthode est la suivante ;

static void SendStreamToString(Action<StreamWriter> action, out string destination)
{
    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream, Encoding.Unicode))
    {
        action(writer);
        writer.Flush();
        stream.Position = 0;
        destination = Encoding.Unicode.GetString(stream.GetBuffer(), 0, (int)stream.Length);
    }
}

Et vous pouvez l'utiliser comme ça ;

string myString;

SendStreamToString(writer =>
{
    var ints = new List<int> {1, 2, 3};
    writer.WriteLine("My ints");
    foreach (var integer in ints)
    {
        writer.WriteLine(integer);
    }
}, out myString);

Je sais que cela peut être fait beaucoup plus facilement avec une StringBuilder L'idée est que vous pouvez appeler n'importe quelle méthode qui prend une valeur de StreamWriter .

1voto

Denise Skidmore Points 1014

Je veux sérialiser des objets en chaînes de caractères, et inversement.

C'est différent des autres réponses, mais le moyen le plus direct de faire exactement cela pour la plupart des types d'objets est XmlSerializer :

        Subject subject = new Subject();
        XmlSerializer serializer = new XmlSerializer(typeof(Subject));
        using (Stream stream = new MemoryStream())
        {
            serializer.Serialize(stream, subject);
            // do something with stream
            Subject subject2 = (Subject)serializer.Deserialize(stream);
            // do something with subject2
        }

Toutes vos propriétés publiques des types supportés seront sérialisées. Même certaines structures de collection sont prises en charge et seront sérialisées jusqu'aux propriétés des sous-objets. Vous pouvez contrôler la façon dont la sérialisation fonctionne avec attributs sur vos propriétés.

Cela ne fonctionne pas avec tous les types d'objets, certains types de données ne sont pas pris en charge pour la sérialisation, mais dans l'ensemble, c'est assez puissant, et vous n'avez pas à vous soucier de l'encodage.

0voto

MD Luffy Points 322

Dans les cas où vous voulez sérialiser/désérialiser des POCO, la bibliothèque JSON de Newtonsoft est vraiment bonne. Je l'utilise pour faire persister les POCO dans SQL Server sous forme de chaînes JSON dans un champ nvarchar. La mise en garde est que, comme il ne s'agit pas d'une véritable dé/sérialisation, elle ne préservera pas les membres privés/protégés et la hiérarchie des classes.

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