Vakar, kad es veicu datu bāzes sinhronizācijas testēšanu, es izmantoju mazliet serializācijas un deserializācijas tehnoloģiju. Es abstrahēju tabulas laukus entītiju klasē DiagramInfo, pēc tam saglabāju jaunos klienta ierakstus vispārējā kolekcijā un pēc tam serializēju šo vispārējo kolekciju un nosūtu to uz serveri, izmantojot TCP, kas to deserializē, un pēc tam ieraksta šos datus datu bāzē. Iespējams, tas ir šīs operācijas process.
Serializācija Es izmantoju klasi System.Runtime.Serialization.Iformatter, lai serializētu vispārējās kolekcijas binārajās plūsmās. Daži no sērijveida kodiem ir šādi:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Kopēt kodu Pēc tam nosūtiet, izmantojot TCP protokolu, šī daļa tiek izlaista.
Serveris daļēji saņem datus, saglabā tos kā MemoryStream un pēc tam tos deserializē, daļa koda ir šāda:
- 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();
Kopēt koduŠobrīd palaidiet klientu un serveri, lai sinhronizētu datus, un tiek parādīts šāds kļūdas ziņojums: Kļūdas uzvedība: diagrammas = (List)formater. Deserializēt (memstream); Burtiski: saskārās ar straumes beigām pirms konvertēšanas pabeigšanas. 2. RisinājumsPēc Google meklēšanas kāds atbildēja uz šādām kļūdu iespējām:1. Serializācijas un deserializācijas veidi ir atšķirīgi, kurus šeit var izslēgt; 2. Serializācijas laikā nav bufera, lai notīrītu straumi, un netiek izmantota Flush() metode, ko var izslēgt arī šeit. 3. Saņemšanas procesa bufera lielums pirms deserializācijas var nebūt pietiekams, es domāju, ka ar to nevajadzētu būt problēmām, deserializācija tiek veikta pēc iegūšanas plūsmas, tai nevajadzētu būt nekāda sakara ar bufera lielumu, personīgo viedokli, es to neesmu izmēģinājis; 4. Pievienojiet pirms deserializācijasstrem. Pozīcija=0。 (Straume ir deserializējamā straume, faktiski memstream) Pēc testēšanas ceturtais var darboties manā programmā. Tātad, kāpēc tas notiek, pēc viena atkļūdošanas soļa novērojiet memstream. Postion vērtība mainās, un tiek konstatēts, ka katru reizi, kad tiek veikta rakstīšanas operācija, vērtība norāda uz beigām, kas izskaidro, kāpēc programma ziņo par šādu kļūdu. Bet tas, ko es nesaprotu, ir tas, kāpēc deserializācijas funkcija (Deserialize), nevis deserializēt visu straumi pēc noklusējuma, sākot no vietas, kur atrodas Positon?
|