Kemarin ketika saya melakukan pengujian sinkronisasi database, saya menggunakan sedikit teknologi serialisasi dan deserialisasi. Saya mengabstraksi bidang tabel ke dalam kelas entitas DiagramInfo, lalu menyimpan rekaman baru klien dalam koleksi generik, lalu menserialisasikan koleksi generik ini dan mengirimkannya ke server melalui TCP, yang mendeserialisasinya, lalu menulis data ini ke database. Ini mungkin proses operasi ini.
Serialisasi Saya menggunakan kelas System.Runtime.Serialization.Iformatter untuk menserialisasikan koleksi generik ke dalam aliran biner. Beberapa kode berseri adalah sebagai berikut:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Salin kode Kemudian kirim menggunakan protokol TCP, bagian ini dihilangkan.
Server menerima sebagian data, menyimpannya sebagai MemoryStream, dan kemudian mendeserialisasinya, bagian dari kode adalah sebagai berikut:
- do
- {
- bytesRead = stream.Read(responseBuffer, 0, bufferSize);
- memstream.Write(responseBuffer, 0, bytesRead);
- }
- while (bytesRead > 0);
- IFormatter formater = new BinaryFormatter();
- diagrams = (List)formater.Deserialize(memstream);
- stream.Close();
- memstream.Close();
- client.Close();
Salin kodePada saat ini, jalankan klien dan server untuk menyinkronkan data, dan pesan kesalahan berikut muncul: Perilaku kesalahan: diagram = pemformat (Daftar). Deserialize (memstream); Secara harfiah: menemukan akhir aliran sebelum konversi selesai. 2. SolusiSetelah pencarian Google, seseorang menjawab kemungkinan kesalahan berikut:1. Jenis serialisasi dan deserialisasi berbeda, yang dapat dikecualikan di sini; 2. Tidak ada buffer untuk menghapus aliran selama serialisasi, dan metode Flush() tidak digunakan, yang juga dapat dikecualikan di sini. 3. Ukuran buffer dari proses penerima sebelum deserialisasi mungkin tidak cukup, saya pikir seharusnya tidak ada masalah dengan ini, deserialisasi dilakukan setelah aliran akuisisi, seharusnya tidak ada hubungannya dengan ukuran buffer, pendapat pribadi, saya belum mencobanya; 4. Tambahkan sebelum deserialisasigemetar. Posisi=0。 (Stream adalah aliran yang akan dideserialisasi, sebenarnya memstream) Setelah pengujian, yang keempat mungkin berhasil untuk program saya. Jadi mengapa ini terjadi, setelah satu langkah debugging, amati memstream. Nilai postion berubah, dan ditemukan bahwa setiap kali operasi tulis dilakukan, nilainya menunjuk ke akhir, yang menjelaskan mengapa program melaporkan kesalahan seperti itu. Tapi yang saya tidak mengerti adalah mengapa fungsi deserialisasi (Deserialize) alih-alih mendeserialisasi seluruh aliran secara default, mulai dari tempat Positon berada?
|