Ich möchte Objekte in Zeichenfolgen und zurück serialisieren.
Wir verwenden protobuf-net, um ein Objekt erfolgreich in einen Stream und zurück zu verwandeln.
Stream zu String und zurück ... nicht so erfolgreich. Nach dem Durchlaufen von StreamToString
und StringToStream
wird das Neue Stream
nicht von protobuf-net deserialisiert. es wird eine Arithmetic Operation resulted in an Overflow
Ausnahme ausgelöst . Wenn wir den ursprünglichen Stream deserialisieren, funktioniert es.
Unsere Methoden:
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);
}
Unser Beispielcode mit diesen beiden:
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);
c#
.net
serialization
deserialization
protobuf-net
flipuhdelphia
quelle
quelle
Antworten:
Das ist so üblich, aber so zutiefst falsch. Protobuf-Daten sind keine Zeichenfolgendaten. Es ist sicherlich nicht ASCII. Sie verwenden die Codierung rückwärts . Eine Textcodierung überträgt:
Sie haben keine "formatierten Bytes". Sie haben beliebige Bytes . Sie müssen so etwas wie eine Base-n-Codierung (normalerweise Base-64) verwenden. Dies überträgt
Schauen Sie sich Convert.ToBase64String und Convert an. FromBase64String
quelle
BinaryFormatter
, ähnlich wie dieses seltsame Beispiel ?Ich habe das gerade getestet und funktioniert gut.
Wenn
stream
bereits geschrieben wurde, möchten Sie möglicherweise zuerst den Anfang suchen, bevor Sie den Text vorlesen:stream.Seek(0, SeekOrigin.Begin);
quelle
eine Konvertierung von UTF8 MemoryStream in String:
quelle
var array = stream.ToArray(); var str = Encoding.UTF8.GetString(array, 0, array.Length);
. Siehe auch msdn.microsoft.com/en-us/library/…ToArray()
ein neues Array im Speicher zu und kopiert Daten aus dem Puffer, was schwerwiegende Auswirkungen haben kann, wenn Sie mit vielen Daten arbeiten.Versuchen Sie es beim Testen mit dem folgenden
UTF8
Encode-Streamquelle
Versuche dies.
quelle
Ich habe eine nützliche Methode geschrieben, um jede Aktion, die a
StreamWriter
ausführt, aufzurufen und stattdessen in eine Zeichenfolge zu schreiben. Die Methode ist wie folgt;Und Sie können es so verwenden;
Ich weiß, dass dies mit a viel einfacher gemacht werden
StringBuilder
kann. Der Punkt ist, dass Sie jede Methode aufrufen können, die a benötigtStreamWriter
.quelle
Anders als die anderen Antworten, aber der einfachste Weg, genau das für die meisten Objekttypen zu tun, ist XmlSerializer:
Alle Ihre öffentlichen Eigenschaften der unterstützten Typen werden serialisiert. Sogar einige Sammlungsstrukturen werden unterstützt und werden zu Unterobjekteigenschaften getunnelt. Sie können steuern, wie die Serialisierung mit Attributen in Ihren Eigenschaften funktioniert .
Dies funktioniert nicht mit allen Objekttypen, einige Datentypen werden für die Serialisierung nicht unterstützt, aber insgesamt ist es ziemlich leistungsfähig und Sie müssen sich nicht um die Codierung kümmern.
quelle
In dem Fall, in dem Sie POCOs serialisieren / deserialisieren möchten, ist die JSON-Bibliothek von Newtonsoft wirklich gut. Ich verwende es, um POCOs in SQL Server als JSON-Zeichenfolgen in einem nvarchar-Feld beizubehalten. Vorsichtsmaßnahme ist, dass private / geschützte Mitglieder und Klassenhierarchien nicht erhalten bleiben, da dies keine echte De- / Serialisierung ist.
quelle