2009-09-01 18 views
7

Czym jest szeregowanie i deserializacja obiektów? Jaka jest różnica między serializacją a normalnymi technikami, takimi jak odczytanie właściwości obiektu, a następnie wypełnienie ich kolumnami DataRow i wreszcie zapisanie DataRow w DB?Szeregowanie i deserializacja obiektów?

Dziękuję

+0

Bardzo dziękuję za wszystkie odpowiedzi, kładę inne pytanie tutaj jako komentarz: Czytanie odpowiedzi, więc kiedy powinno być pomocne użycie serializacji w aplikacji korzystającej z DB? – odiseh

Odpowiedz

1

serializacji jest, na ogół, proces zapisu stanu obiektu w czasie wykonywania na dysku (ale może być wszędzie), i jest w stanie go ponownie przeczytać.

Skutecznie, przechowywanie właściwości obiektu w tabeli jest formą serializacji.

W .NET, istnieją inne formy:

  • XmlSerialization
  • BinarySerialization

Można uzupełnić własną rękę.

Generalnie, jeśli zachowujesz gdzieś swój obiekt, a następnie czytasz go z powrotem w obiekcie "na żywo" w twoim środowisku wykonawczym, tworzysz go szeregowo.

+2

Serializacja niekoniecznie oznacza zapisanie go na dysku. Oznacza to tylko umieszczenie go w formacie binarnym, który można wyeksportować. Serializowany obiekt może być wysłany przez sieć, a nie zapisany na dysk, na przykład. – Chuck

+0

Tak, dlatego na dole napisałem "gdzieś". Właśnie opuściłem "ogólnie" w pierwszym zdaniu. Masz rację, oczywiście. –

14

Serializacja odnosi się ogólnie do tworzenia wersji danych (a nie obiektów), które mogą być używane do przechowywania (być może w pliku), do przesyłania przez sieć, a może tylko do przesyłania między procesami/AppDomain s/itp. na jednym komputerze.

Serializacja oznacza zwykle zapisywanie danych w postaci ciągu znaków (think: xml/json) lub jako surowego pliku binarnego (byte[] itp.). Deserializacja jest procesem odwrotnym; pobieranie surowych danych (z pliku, z przychodzącego gniazda sieciowego itp.) i rekonstrukcja modelu obiektowego.

Różnica między używaniem db polega na tym, że nie ma on wewnętrznego układu tabelarycznego i nie ma prawdziwego powiązania z bazą danych; dane mogą mieć dowolny kształt i mają tendencję do dokładniejszego odwzorowywania układu obiektowego niż do charakteru wierszy/kolumn tabel.

Większość platform ma szereg narzędzi do serializacji. Na przykład wygląda na to, że mówisz o .NET - więc(.NET-specific), XmlSerializer, DataContractSerializer, Json.NET i protobuf-net/dotnet-protobufs zostaną zakwalifikowane.

5

Serializacja = wprowadzenie odpowiedniego stanu obiektu do odtwarzalnej transmisji. Może to oznaczać konwersję do strumienia bajtów. Nie musi to obejmować kopiowania każdej zmiennej członka do strumienia. Klasycznym przykładem używanym przez Joshua Blocha w Effective Java jest HashSet. Po prostu serializuje się elementy w Hashset, ale nie klucze.

Deserializacja = przywracanie obiektu z reprezentacji szeregowej i zapewnianie niezmienników obiektu. Deserializacja może być traktowana jako oddzielny konstruktor obiektu. W przypadku wspomnianego wyżej HashSet utworzysz nowy HashSet, a następnie wstawisz wartości ze strumienia do tej nowej struktury danych.

+0

przegłosowano dla podpowiedzi etymologicznych. Serializacja przenosi obiekt * drzewo * (hierarchiczny) do reprezentacji szeregowej (płaskiej), bez utraty semantyki. –

+0

Nie ma to nic wspólnego z tym, czy kondensujesz go z "drzewa" do "płaskiej" reprezentacji. Możesz serializować do bazy danych, która jest nadal w formacie drzewa i deserializować z tego. To nie ma znaczenia. –

+0

Nie sądzę, że ogólnie wersja db jest seryjną wersją obiektu. Dane zawarte w obiekcie można podzielić na kilka tabel. Idea serializacji polega na tworzeniu reprezentacji, która może być przesyłana bit po bicie (to jest szeregowo). – jens

3

Serializacja oznacza, że ​​utrzymujesz swój obiekt w reprezentacji, którą możesz gdzieś przechowywać. Jednym ze sposobów, aby to zrobić, jest przeniesienie wskaźnika do miejsca, w którym obiekt jest przechowywany w pamięci i zapisanie każdego bajtu do pliku.Ponieważ ta reprezentacja jest bardzo specyficzna dla twojego języka programowania (i sposobu, w jaki reprezentuje obiekty w pamięci), ulepszenie byłoby przekształcenie twojego obiektu w reprezentację String, która ma pewną dobrze znaną strukturę (jak XML lub JSON), tak że ty można

a) przeniesienie łatwiej

b) zachować i przywrócić łatwiej

c) Ponieważ wszyscy wiedzą, jaki format jest zdefiniowany, inne programy mogą odczytać obiekt, zbyt

Tak umieszczenie obiektu w bazie danych to po prostu kolejna forma serializacji.

Deserializacja oznacza, że ​​można ponownie załadować/przywrócić obiekt z miejsca, w którym został zapisany.

0

serializacji

serializacji jest procesem przekształcania przedmiotu lub zestawu przedmiotów wykresie na strumień.

Deserializacji

Deserializacji jest procesem przekształcania z powrotem do strumienia w przedmiotu lub zestawu przedmiotów wykresu.

Oto niektóre atrybuty niestandardowe:

[OnDeserialization] -> Jest stosowany, kiedy musimy wykonać pewne działania podczas deserializacji strumienia. [OnDeserialized] -> Jest używany, gdy musimy wykonać pewne działanie po przekształceniu strumienia w obiekt. Takie jak ustawienie wartości pola obiektu prawidłowo

Poniżej znajduje się przykład

[Serializable] 
    internal class DemoForSerializableAndDeserializable 
    { 
     internal string Fname = string.Empty; 
     internal string Lname = string.Empty; 

     internal Stream SerializeToMS(DemoForSerializableAndDeserializable objDemo) 
     { 
      DemoForSerializableAndDeserializable objSer = new DemoForSerializableAndDeserializable(); 
      MemoryStream ms = new MemoryStream(); 
      BinaryFormatter bf = new BinaryFormatter(); 
      bf.Serialize(ms, objSer); 
      return ms; 
     } 

     [OnDeserializing] 
     private void OnDeserializing(StreamingContext context) 
     { 
      // Do some work while deserializing the stream 
     } 
     [OnDeserialized] 
     private void OnSerialized(StreamingContext context) 
     { 
      Fname = "abc"; 
     } 

    } 

Kod telefoniczny

class CallingCode 
    { 
     string fname = string.Empty; 
     string Lname = string.Empty; 

     static void Main(string[] args) 
     { 
      DemoForSerializableAndDeserializable demo = new DemoForSerializableAndDeserializable(); 

      Stream ms = demo.SerializeToMS(demo); 
      ms.Position = 0; 

      DemoForSerializableAndDeserializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializableAndDeserializable; 

      Console.WriteLine(demo1.Fname); 
      Console.WriteLine(demo1.Lname); 
      Console.ReadLine(); 
     } 

    } 
Powiązane problemy