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

321voto

Ehsan Points 14327

Je viens de le tester et cela 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 stream a déjà fait l'objet d'un écrit, vous pourriez chercher à reprendre le début avant de lire le texte à voix haute : stream.Seek(0, SeekOrigin.Begin);

66voto

Marc Gravell Points 482669

C'est si commun mais si profondément faux. Les données Protobuf ne sont pas des données de type chaîne. Ce n'est certainement pas ASCII. Vous utilisez l'encodage à l'envers . Un transfert d'encodage de texte :

  • une chaîne arbitraire en octets formatés
  • octets formatés à la chaîne originale

Vous n'avez pas d'"octets formatés". Vous avez octets arbitraires . Vous devez utiliser quelque chose comme un encodage en base-n (communément appelé base-64). Cela transfère

  • octets arbitraires vers une chaîne formatée
  • une chaîne formatée aux octets originaux

Regardez Convert.ToBase64String et Convert. FromBase64String

15voto

Wolfgang Grinfeld Points 450

Une conversion UTF8 de MemoryStream en String :

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

6voto

Damith Points 32311

Lorsque vous essayez de tester avec UTF8 Encodez le flux comme ci-dessous

var stream = new MemoryStream();
var streamWriter = new StreamWriter(stream, System.Text.Encoding.UTF8);
Serializer.Serialize<SuperExample>(streamWriter, test);

6voto

user3588327 Points 11

Essayez ça.

string output1 = Encoding.ASCII.GetString(byteArray, 0, byteArray.Length)

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