Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 18725|Atbildi: 0

[Avots] Viens jautājums par serializāciju un deserializāciju

[Kopēt saiti]
Publicēts 27.10.2015 19:07:26 | | | |
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:

  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.         }
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:
  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();
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?





Iepriekšējo:Virkne[3]: rekvizīta Size lielums ir nederīgs 0.
Nākamo:vs2010 savienojuma serveris vss2005 laika kļūda, problēma ir tāda, kā parādīts attēlā, lūdziet Dieva palīdzību
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com