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:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
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:
- 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();
Kopya koduBu 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ı?
|