2009-09-01 32 views
7

Serialization Object và Deserialization là gì? Serialization có những khác biệt gì với các kỹ thuật bình thường như đọc thuộc tính của đối tượng và sau đó điền vào các cột của DataRow với chúng và cuối cùng là lưu DataRow trong DB?Nối tiếp đối tượng và Deserialization?

Cảm ơn bạn

+0

Cảm ơn rất nhiều cho tất cả các câu trả lời của bạn, tôi đặt câu hỏi khác ở đây như là một lời nhận xét: Đọc câu trả lời của bạn, vì vậy khi nào nó hữu ích khi sử dụng tuần tự hóa trong một ứng dụng sử dụng DB? – odiseh

Trả lời

1

Serialization là, nói chung, quá trình viết trạng thái của một đối tượng trong thời gian chạy của bạn vào đĩa (nhưng nó có thể là bất cứ nơi nào), và có thể đọc nó trở lại.

Có hiệu quả, việc lưu trữ các thuộc tính của đối tượng vào bảng là một dạng tuần tự hóa.

Trong .NET, có các hình thức khác:

  • XmlSerialization
  • BinarySerialization

Bạn có thể tạo nên của riêng bạn.

Nhưng nói chung, nếu bạn đang lưu trạng thái của đối tượng của bạn ở đâu đó, và sau đó đọc lại nó vào đối tượng 'trực tiếp' trong thời gian chạy, bạn đang sắp xếp nó.

+2

Việc tuần tự hóa không nhất thiết có nghĩa là ghi nó vào đĩa. Nó chỉ có nghĩa là đưa nó vào một số định dạng nhị phân có thể được xuất khẩu. Ví dụ, một đối tượng được tuần tự hóa có thể được gửi qua mạng thay vì được ghi vào đĩa. – Chuck

+0

Vâng, đó là lý do tại sao ở phía dưới tôi đã viết 'ở đâu đó'. Tôi chỉ bỏ lỡ một 'nói chung', trong câu đầu tiên. Bạn nói đúng, tất nhiên. –

14

Nối tiếp thường đề cập đến việc tạo phiên bản dữ liệu (thay vì đối tượng) có thể được sử dụng để lưu trữ (có thể trong tệp), để chuyển qua mạng hoặc có thể chỉ để chuyển giữa các quy trình/AppDomain s/vv trên một máy.

Nối tiếp thường có nghĩa là ghi dữ liệu dưới dạng chuỗi (nghĩ: xml/json) hoặc dưới dạng nhị phân thô (một số byte[] v.v.). Deserialization là quá trình ngược lại; lấy dữ liệu thô (từ một tập tin, từ một ổ cắm mạng đến, vv) và xây dựng lại mô hình đối tượng.

Sự khác biệt giữa việc sử dụng db là nó không có bố cục bảng nội tại và không có liên kết thực với cơ sở dữ liệu; dữ liệu có thể là bất kỳ hình dạng nào và có xu hướng ánh xạ chặt chẽ hơn với bố cục hướng đối tượng hơn là bản chất của các hàng/cột.

Hầu hết các nền tảng đều có một loạt các công cụ tuần tự hóa. Ví dụ, có vẻ như bạn đang nói về .NET - do đó, BinaryFormatter (.NET-specific), XmlSerializer, DataContractSerializer, Json.NET và protobuf-net/dotnet-protobufs đều đủ điều kiện.

5

Nối tiếp = đặt trạng thái của đối tượng có liên quan vào biểu diễn có thể phát trực tiếp. Điều đó có nghĩa là chuyển đổi nó thành một luồng byte. Điều này không nhất thiết bao gồm việc sao chép mọi biến thành viên vào luồng. Ví dụ cổ điển được sử dụng bởi Joshua Bloch trong Java hiệu quả là một HashSet. Bạn sẽ chỉ tuần tự hóa các phần tử trong Hashset chứ không phải các khóa.

Deserialization = khôi phục đối tượng từ biểu diễn nối tiếp và đảm bảo các bất biến của đối tượng. Deserialization có thể được suy nghĩ của một constructor riêng biệt cho đối tượng. Trong trường hợp của HashSet được đề cập ở trên, bạn sẽ tạo một HashSet mới và sau đó chèn các giá trị từ luồng vào cấu trúc dữ liệu mới này.

+0

upvoted cho gợi ý từ nguyên. Nối tiếp mang một đối tượng * cây * (phân cấp) vào một đại diện nối tiếp (phẳng), mà không mất ngữ nghĩa. –

+0

Nó không có gì để làm với việc bạn có ngưng tụ nó từ một cây '' để đại diện 'phẳng'. Bạn có thể nối tiếp đến một cơ sở dữ liệu vẫn còn trong một định dạng cây, và deserialise ra khỏi đó. Nó không liên quan. –

+0

Tôi không nghĩ rằng nói chung một phiên bản db là một phiên bản nối tiếp của một đối tượng. Dữ liệu chứa trong một đối tượng có thể được chia thành nhiều bảng. Ý tưởng về tuần tự hóa là tạo ra một biểu diễn có thể được chuyển từng chút một (tức là serially). – jens

3

Công cụ tuần tự hóa có nghĩa là bạn vẫn lưu giữ đối tượng của mình thành một biểu diễn để bạn có thể lưu trữ ở đâu đó. Một cách để làm như vậy là chỉ cần đưa con trỏ đến nơi đối tượng của bạn được lưu trữ trong bộ nhớ và viết mỗi byte như nó là một tập tin.Do biểu diễn đó rất cụ thể đối với ngôn ngữ lập trình của bạn (và cách nó thể hiện các đối tượng trong bộ nhớ), một sự cải tiến sẽ là chuyển đổi đối tượng của bạn thành một biểu diễn String có cấu trúc nổi tiếng nhất định (như XML hoặc JSON). có thể

a) chuyển nó dễ dàng hơn

b) Lưu trữ và khôi phục nó dễ dàng hơn

c) Kể từ khi mọi người đều biết cách định dạng được định nghĩa, bất kỳ chương trình khác có thể đọc đối tượng của bạn, quá

Vì vậy, đưa bạn đối tượng vào cơ sở dữ liệu cũng chỉ là một dạng tuần tự hóa khác nữa.

Deserialization nghĩa là bạn có thể tải/khôi phục lại đối tượng đó từ nơi bạn đã lưu nó.

0

serialization

Serialization là quá trình chuyển đổi một đối tượng hoặc một tập các đối tượng đồ thị thành một dòng suối.

Deserialization

Deserialization là quá trình chuyển đổi trở lại dòng thành một đối tượng hoặc một tập hợp các đối tượng đồ thị.

Dưới đây là một số tùy chỉnh các thuộc tính:

[OnDeserialization] -> Nó được sử dụng khi chúng ta cần phải thực hiện một số hành động trong deserialization của con suối. [OnDeserialized] -> Nó được sử dụng khi chúng ta cần thực hiện một số hành động sau khi deserialized dòng vào một đối tượng. Chẳng hạn như thiết lập giá trị trường của đối tượng đúng

Dưới đây là ví dụ

[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"; 
     } 

    } 

Calling Mã

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

    } 
Các vấn đề liên quan