Saya sedang menulis koneksi TCP prototipe dan saya mengalami beberapa kesulitan menyeragamkan data yang akan dikirim.
Saat ini, saya tidak mengirim apa pun kecuali string, tetapi di masa depan kami ingin dapat mengirim objek apa pun.
Kode ini cukup sederhana saat ini, karena saya pikir semuanya dapat dilemparkan ke dalam array byte:
void SendData(object headerObject, object bodyObject)
{
byte[] header = (byte[])headerObject; //strings at runtime,
byte[] body = (byte[])bodyObject; //invalid cast exception
// Unable to cast object of type 'System.String' to type 'System.Byte[]'.
...
}
Ini tentu saja cukup mudah diselesaikan dengan
if( state.headerObject is System.String ){...}
Masalahnya adalah, jika saya melakukannya dengan cara itu, saya perlu memeriksa SETIAP jenis objek yang tidak dapat dilemparkan ke byte [] saat runtime.
Karena saya tidak tahu setiap objek yang tidak dapat dilemparkan ke byte [] pada saat runtime, ini sebenarnya bukan pilihan.
Bagaimana cara mengubah objek apa pun menjadi array byte di C # .NET 4.0?
FileStream
, atau objek apa pun yang merangkum pegangan seperti itu).Jawaban:
Gunakan
BinaryFormatter
:Perhatikan bahwa
obj
dan semua properti / bidang dalamobj
(dan seterusnya untuk semua properti / bidangnya) semua harus ditandai denganSerializable
atribut agar berhasil diserialisasi dengan ini.sumber
using
blok, karena ia akan dengan bersemangat melepaskan buffer internal yang digunakan.checkout artikel ini: http://www.morgantechspace.com/2013/08/convert-object-to-byte-array-and-vice.html
Gunakan kode di bawah ini
sumber
MemorySteam
harus dibungkus dalam satuusing
blok.Seperti orang lain katakan sebelumnya, Anda bisa menggunakan serialisasi biner, tetapi mungkin menghasilkan byte tambahan atau deserialized menjadi objek dengan data yang tidak persis sama. Menggunakan refleksi di sisi lain cukup rumit dan sangat lambat. Ada solusi lain yang secara ketat dapat mengkonversi objek Anda menjadi byte dan sebaliknya - marshalling:
Dan untuk mengonversi byte ke objek:
Terlihat lebih lambat dan sebagian tidak aman untuk menggunakan pendekatan ini untuk objek dan struct kecil dibandingkan dengan bidang serialisasi Anda sendiri berdasarkan bidang (karena penyalinan ganda dari / ke memori yang tidak dikelola), tetapi cara termudah untuk secara ketat mengkonversi objek ke byte [] tanpa menerapkan serialisasi dan tanpa atribut [Serializable].
sumber
StructureToPtr
+Copy
lambat? Bagaimana bisa lebih lambat dari serialisasi? Apakah ada solusi yang lebih cepat?var bytes = new byte[size];
Apa yang Anda cari adalah serialisasi. Ada beberapa bentuk serialisasi yang tersedia untuk platform .Net
byte[]
sumber
Anda dapat menggunakannya seperti kode di bawah ini.
sumber
Menggunakan
Encoding.UTF8.GetBytes
lebih cepat daripada menggunakanMemoryStream
. Di sini, saya menggunakan NewtonsoftJson untuk mengkonversi objek input ke string JSON dan kemudian mendapatkan byte dari string JSON.Benchmark untuk versi @Daniel DiPaolo dengan versi ini
sumber
Solusi Gabungan di kelas Ekstensi:
sumber
Anda bisa menggunakan alat serialisasi built-in dalam framework dan membuat serial ke MemoryStream . Ini mungkin opsi yang paling mudah, tetapi mungkin menghasilkan byte yang lebih besar [] daripada yang diperlukan untuk skenario Anda.
Jika itu masalahnya, Anda bisa menggunakan refleksi untuk beralih pada bidang dan / atau properti dalam objek yang akan diserialkan dan secara manual menuliskannya ke MemoryStream, memanggil serialisasi secara rekursif jika diperlukan untuk membuat serial jenis non-sepele. Metode ini lebih kompleks dan akan membutuhkan lebih banyak waktu untuk diterapkan, tetapi memungkinkan Anda lebih banyak mengontrol aliran serial.
sumber
Bagaimana dengan hal sederhana seperti ini?
sumber
Saya lebih suka menggunakan ekspresi "serialisasi" daripada "casting ke byte". Membuat serial objek berarti mengubahnya menjadi array byte (atau XML, atau yang lain) yang dapat digunakan pada kotak jauh untuk membangun kembali objek. Di .NET,
Serializable
atribut menandai tipe objek yang dapat diserialisasi.sumber
Cara alternatif untuk mengubah objek ke byte array:
sumber
Satu implementasi tambahan, yang menggunakan JSON biner Newtonsoft.Json dan tidak perlu menandai semuanya dengan atribut [Serializable]. Hanya satu kelemahan adalah bahwa suatu objek harus dibungkus dalam kelas anonim, sehingga array byte yang diperoleh dengan serialisasi biner dapat berbeda dari yang satu ini.
Kelas anonim digunakan karena BSON harus dimulai dengan kelas atau array. Saya belum mencoba deserialize byte [] kembali ke objek dan tidak yakin apakah itu berfungsi, tetapi telah menguji kecepatan konversi ke byte [] dan itu benar-benar memuaskan kebutuhan saya.
sumber
Bagaimana dengan serialisasi? lihat di sini .
sumber