Saya ingin membuat serial objek untuk string, dan kembali.
Kami menggunakan protobuf-net untuk mengubah objek menjadi Stream dan kembali, berhasil.
Namun, Streaming ke string dan kembali ... tidak begitu sukses. Setelah melalui StreamToString
dan StringToStream
, yang baru Stream
tidak deserialized oleh protobuf-net; itu memunculkan Arithmetic Operation resulted in an Overflow
pengecualian. Jika kami membatalkan deserialisasi aliran asli, itu berfungsi.
Metode kami:
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);
}
Contoh kode kami menggunakan dua ini:
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
sumber
sumber
Jawaban:
Ini sangat umum tetapi sangat salah. Data protobuf bukan data string. Jelas bukan ASCII. Anda menggunakan penyandian mundur . Pengkodean teks transfer:
Anda tidak memiliki "byte yang diformat". Anda memiliki byte yang berubah - ubah . Anda perlu menggunakan sesuatu seperti pengkodean base-n (umumnya: base-64). Ini transfer
lihat Convert.ToBase64String dan Konversi. FromBase64String
sumber
BinaryFormatter
, mirip dengan contoh aneh ini ?Saya baru saja menguji ini dan berfungsi dengan baik.
Jika
stream
sudah ditulis, Anda mungkin ingin mencari dari awal sebelum yang pertama sebelum membacakan teks:stream.Seek(0, SeekOrigin.Begin);
sumber
konversi UTF8 MemoryStream ke String:
sumber
var array = stream.ToArray(); var str = Encoding.UTF8.GetString(array, 0, array.Length);
. Lihat juga msdn.microsoft.com/en-us/library/…ToArray()
mengalokasikan array baru dalam memori dan menyalin data dari buffer, yang mungkin memiliki implikasi serius jika Anda berurusan dengan banyak data.Saat Anda menguji coba dengan
UTF8
Encode stream seperti di bawah inisumber
Coba ini.
sumber
Saya menulis metode yang berguna untuk memanggil tindakan apa pun yang mengambil
StreamWriter
dan menuliskannya ke string. Metodenya seperti ini;Dan Anda bisa menggunakannya seperti ini;
Saya tahu ini bisa dilakukan lebih mudah dengan
StringBuilder
, intinya adalah bahwa Anda dapat memanggil metode apa saja yang membutuhkanStreamWriter
.sumber
Berbeda dari jawaban lain, tetapi cara paling mudah untuk melakukan hal itu untuk sebagian besar tipe objek adalah XmlSerializer:
Semua properti publik Anda dari jenis yang didukung akan diserialisasi. Bahkan beberapa struktur koleksi didukung, dan akan terowongan ke properti sub-objek. Anda dapat mengontrol cara kerja serialisasi dengan atribut di properti Anda.
Ini tidak bekerja dengan semua jenis objek, beberapa tipe data tidak didukung untuk serialisasi, tetapi secara keseluruhan cukup kuat, dan Anda tidak perlu khawatir tentang pengkodean.
sumber
Di usecase di mana Anda ingin membuat serial / deserialize POCOs, pustaka JSON Newtonsoft sangat bagus. Saya menggunakannya untuk bertahan POCO dalam SQL Server sebagai string JSON di bidang nvarchar. Peringatan adalah bahwa karena itu tidak benar de / serialisasi, itu tidak akan melestarikan anggota pribadi / dilindungi dan hirarki kelas.
sumber