[c#] Conversion de Stream en String et retour ... qu'est-ce qui nous manque?



Answers

Je viens de tester cela et fonctionne bien.

string test = "Testing 1-2-3";

// convert string to stream
byte[] byteArray = Encoding.ASCII.GetBytes(test);
MemoryStream stream = new MemoryStream(byteArray);

// convert stream to string
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();

Si le stream a déjà été écrit, vous pouvez rechercher le début avant le début avant de lire le texte: stream.Seek(0, SeekOrigin.Begin);

Question

Je veux sérialiser des objets en chaînes, et inversement.

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

Cependant, Stream à chaîne et retour ... pas si réussi. Après avoir traversé StreamToString et StringToStream , le nouveau Stream n'est pas désérialisé par protobuf-net; il déclenche une Arithmetic Operation resulted in an Overflow exception de Arithmetic Operation resulted in an Overflow . 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 utilisant 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);



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

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 facile avec un StringBuilder , le fait est que vous pouvez appeler n'importe quelle méthode qui prend un StreamWriter .




une conversion UTF8 MemoryStream en chaîne:

var res = Encoding.UTF8.GetString(stream.GetBuffer(),0 , stream.GetBuffer().Length)





Links