Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 18725|Jawab: 0

[Sumber] Satu pertanyaan tentang serialisasi dan deserialisasi

[Salin tautan]
Diposting pada 27/10/2015 19.07.26 | | | |
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:

  1. private void Seriable(List diagrams)
  2.        {

  3.             MemoryStream stream = new MemoryStream();

  4.             IFormatter formater = new BinaryFormatter();

  5.             formater.Serialize(stream, diagrams);

  6.             stream.Flush();

  7.             serializedData = stream.ToArray();

  8.             stream.Close();

  9.         }
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:
  1. do
  2. {

  3.       bytesRead = stream.Read(responseBuffer, 0, bufferSize);

  4.       memstream.Write(responseBuffer, 0, bytesRead);

  5. }

  6. while (bytesRead > 0);

  7. IFormatter formater = new BinaryFormatter();

  8. diagrams = (List)formater.Deserialize(memstream);

  9. stream.Close();

  10. memstream.Close();

  11. client.Close();
Salin kode
Pada 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?





Mantan:String[3]: properti Size memiliki ukuran tidak valid 0.
Depan:Kesalahan waktu server koneksi vss2010 vss2005, masalahnya seperti yang ditunjukkan pada gambar, mintalah bantuan dewa
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com