Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 18725|Yanıt: 0

[Kaynak] Serileştirme ve serilikten çıkarma hakkında bir soru

[Bağlantıyı kopyala]
Yayınlandı 27.10.2015 19:07:26 | | | |
Dün veritabanı senkronizasyon testi yaparken, biraz serileştirme ve seri aldırma teknolojisi kullandım. Bir tablodaki alanları DiagramInfo adlı varlık sınıfına soyutlar, sonra istemcinin yeni kayıtlarını genel bir koleksiyonda saklıyorum, ardından bu genel koleksiyonu seri yapıp TCP üzerinden sunucuya gönderiyorum, TCP de serilikten çıkarıyor ve bu verileri veritabanına yazıyorum. Muhtemelen bu operasyonun süreci budur.

       Serileştirme System.Runtime.Serialization.Iformatter sınıfını kullanarak genel koleksiyonları ikili akışlara seriledim. Serileştirilmiş kodlardan bazıları şunlardır:

  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.         }
Kopya kodu
Sonra TCP protokolünü kullanarak gönderin, bu kısım çıkarılmıştır.

Sunucu veriyi kısmen alır, MemoryStream olarak kaydeder ve ardından serilikten çıkarır, kodun bir kısmı şöyledir:
  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();
Kopya kodu
Bu sırada, verileri senkronize etmek için istemci ve sunucuyu çalıştırın, aşağıdaki hata mesajı görünür:
Hata davranışı: diyagramlar = (Liste)formatlayıcı. Deserialize (memstream);
Kelimenin tam anlamıyla: dönüşüm tamamlanmadan derenin sonuna ulaştı.
2. ÇözümGoogle aramasından sonra biri aşağıdaki hata olasılıklarını yanıtladı:
1. Serileştirme ve serilikten çıkarma türleri farklıdır, bu da burada hariç tutulabilir;
2. Serileştirme sırasında akışı temizlemek için tampon yoktur ve Flush() yöntemi kullanılmaz, bu da burada hariç tutulabilir.
3. Deserileştirme öncesi alıcı sürecin tampon boyutu yeterli olmayabilir, bence bunda bir sorun olmamalı, deserileştirme satın alma akışından sonra yapılır, tampon boyutuyla ilgisi olmamalı, kişisel görüşüm, denemedim;
4. Deserileştirmeden önce ekleyinstrem. Pozisyon=0。 (Stream, seri dışı bırakılacak akıştır, aslında memstream)
Testten sonra dördüncü yöntem programım için işe yarayabilir. Peki neden bu oluyor, tek bir hata ayıklama adımından sonra memstream'i gözlemleyin. Postion'un değeri değişir ve her yazma işlemi yapıldığında değerin sona işaret ettiği tespit edilir; bu da programın neden böyle bir hata rapor ettiğini açıklar. Ama anlamadığım şey, serilikten çıkarma fonksiyonunun neden (Deseriize etmek) varsayılan olarak tüm akışı seri halinde olarak deserileştirmek yerine, Pozitonun bulunduğu yerden başlayacak mı?





Önceki:String[3]: Size özelliğinin geçersiz boyutu 0'dır.
Önümüzdeki:vs2010 bağlantı sunucusu vss2005 zaman hatası, sorun şekilde gösterildiği gibi, tanrıdan yardım iste
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com