[Nối tiếp] là gì và khi nào tôi nên sử dụng nó?


317

Tôi phát hiện ra rằng một số lớp sử dụng [Serializable]thuộc tính.

  • Nó là gì?
  • Khi nào tôi nên sử dụng nó?
  • Những loại lợi ích tôi sẽ nhận được?



1
Đây là một lời giải thích sử dụng thực tế tôi tìm thấy.
Nipuna

Câu trả lời:


368

Nó là gì?

Khi bạn tạo một đối tượng trong ứng dụng khung .Net, bạn không cần phải suy nghĩ về cách dữ liệu được lưu trữ trong bộ nhớ. Bởi vì .Net Framework sẽ chăm sóc điều đó cho bạn. Tuy nhiên, nếu bạn muốn lưu trữ nội dung của một đối tượng vào một tệp, gửi một đối tượng đến một quá trình khác hoặc truyền nó qua mạng, bạn phải suy nghĩ về cách đối tượng được thể hiện bởi vì bạn sẽ cần phải chuyển đổi sang một định dạng khác . Chuyển đổi này được gọi là SERIALIZATION.

Sử dụng để tuần tự hóa

Tuần tự hóa cho phép nhà phát triển lưu trạng thái của một đối tượng và tạo lại nó khi cần thiết, cung cấp lưu trữ đối tượng cũng như trao đổi dữ liệu. Thông qua việc tuần tự hóa, nhà phát triển có thể thực hiện các hành động như gửi đối tượng đến ứng dụng từ xa bằng Dịch vụ web, chuyển một đối tượng từ miền này sang miền khác, truyền đối tượng qua tường lửa dưới dạng chuỗi XML hoặc duy trì bảo mật hoặc cụ thể của người dùng thông tin trên các ứng dụng.

Áp dụng SerializableAttributecho một loại để chỉ ra rằng các thể hiện của loại này có thể được tuần tự hóa. Áp dụng SerializableAttributengay cả khi lớp cũng thực hiện ISerializablegiao diện để điều khiển quá trình tuần tự hóa.

Tất cả các trường công khai và riêng tư trong một loại được đánh dấu SerializableAttributetheo mặc định được xê-ri hóa, trừ khi loại thực hiện ISerializablegiao diện để ghi đè quá trình tuần tự hóa. Quá trình tuần tự hóa mặc định loại trừ các trường được đánh dấu NonSerializedAttribute. Nếu một trường thuộc kiểu tuần tự hóa chứa con trỏ, tay cầm hoặc một số cấu trúc dữ liệu khác dành riêng cho một môi trường cụ thể và không thể được phục hồi một cách có ý nghĩa trong một môi trường khác, thì bạn có thể muốn áp dụng NonSerializedAttributecho trường đó.

Xem MSDN để biết thêm chi tiết.

Chỉnh sửa 1

Bất kỳ lý do để không đánh dấu một cái gì đó là tuần tự

Khi truyền hoặc lưu dữ liệu, bạn cần gửi hoặc chỉ lưu dữ liệu cần thiết. Vì vậy, sẽ có ít sự chậm trễ chuyển và các vấn đề lưu trữ. Vì vậy, bạn có thể từ chối khối dữ liệu không cần thiết khi tuần tự hóa.


1
@dwbartz Câu hỏi của bạn được trả lời tại đây link
jayasurya_j

2
Khám phá rất hay, sẽ rất hay nếu thêm thuộc tính này vào MSDN =)
Martea 22/03/18

@jayasurya_j Thật tệ khi câu trả lời được chấp nhận không nói nhiều về những phần riêng tư
Alexander

1
Giải thích tốt
Zakir HC

42

Một số sử dụng thực tế cho [Serializable]thuộc tính:

  • Lưu trạng thái đối tượng bằng cách sử dụng tuần tự nhị phân; bạn có thể rất dễ dàng 'lưu' toàn bộ các thể hiện đối tượng trong ứng dụng của mình vào một tệp hoặc luồng mạng và sau đó tạo lại chúng bằng cách giải tuần tự hóa - kiểm tra BinaryFormatterlớp trong System.R nb.Serialization.Formatters.Binary
  • Viết các lớp có thể hiện đối tượng có thể được lưu trữ trên bảng tạm bằng cách sử dụng Clipboard.SetData()- các lớp không thể xác định có thể được đặt trên bảng tạm.
  • Viết các lớp tương thích với .NET Remote; nói chung, bất kỳ trường hợp lớp nào bạn chuyển qua giữa các miền ứng dụng (ngoại trừ các miền mở rộng từ MarshalByRefObject) phải được nối tiếp.

Đây là những trường hợp sử dụng phổ biến nhất mà tôi đã gặp.


42

Vì câu hỏi ban đầu là về SerializableAttribution, nên lưu ý rằng thuộc tính này chỉ áp dụng khi sử dụng BinaryFormatter hoặc SoapFormatter.

Nó hơi khó hiểu, trừ khi bạn thực sự chú ý đến các chi tiết, khi nào nên sử dụng nó và mục đích thực sự của nó là gì.

Nó KHÔNG CÓ gì để làm với tuần tự hóa XML hoặc JSON.

Được sử dụng với SerializableAttribution là Giao diện ISerializable và Lớp serializationInfo. Chúng cũng chỉ được sử dụng với BinaryFormatter hoặc SoapFormatter.

Trừ khi bạn có ý định tuần tự hóa lớp học của mình bằng Binary hoặc Soap, đừng bận tâm đánh dấu lớp của bạn là [Nối tiếp]. Các trình tuần tự hóa XML và JSON thậm chí không nhận thức được sự tồn tại của nó.


16
"Không có gì phải làm với tuần tự hóa XML hoặc JSON" - CẢM ƠN BẠN! Cuối cùng, một lời giải thích tại sao tôi có thể vui vẻ tuần tự hóa bất kỳ lớp nào thành XML có hoặc không có thuộc tính này
userSteve

1
Bạn có một nguồn cho việc này?
Michiel van Oosterhout

"Các trình tuần tự hóa XML và JSON thậm chí không nhận thức được sự tồn tại của nó". Tôi không biết về điều đó. Khi tôi JSON định dạng một lớp thông qua WCF, các tên thuộc tính xuất hiện với dấu gạch dưới trước nếu lớp đó Serializablevà không có khi thuộc tính bị xóa. Vì vậy, một số can thiệp là có thể.
Jens

@Jens nếu tôi hiểu chính xác JSON.net không quan tâm một chút về nó nhưng asp.net thay đổi hành vi này một chút. Tôi tin rằng bạn có thể phá vỡ điều này với các thuộc tính JsonObject / JsonProperty.
Căn cứ

29

Tuần tự hóa là quá trình chuyển đổi một đối tượng thành một luồng byte để lưu trữ đối tượng hoặc truyền nó vào bộ nhớ, cơ sở dữ liệu hoặc tệp.

Cách thức tuần tự hóa hoạt động

Hình minh họa này cho thấy quá trình tổng thể của tuần tự hóa.

nhập mô tả hình ảnh ở đây

Đối tượng được tuần tự hóa thành một luồng, không chỉ mang dữ liệu, mà còn thông tin về loại đối tượng, chẳng hạn như phiên bản, văn hóa và tên lắp ráp của nó. Từ luồng đó, nó có thể được lưu trữ trong cơ sở dữ liệu, tệp hoặc bộ nhớ.

Chi tiết trong msd.



14

Tuần tự hóa

Tuần tự hóa là quá trình chuyển đổi một đối tượng hoặc một tập hợp các biểu đồ đối tượng thành một luồng, nó là một mảng byte trong trường hợp tuần tự hóa nhị phân

Công dụng của tuần tự hóa

  1. Để lưu trạng thái của một đối tượng vào một tệp, cơ sở dữ liệu, vv và sử dụng nó sau.
  2. Để gửi một đối tượng từ một quá trình này sang một quá trình khác (Miền ứng dụng) trên cùng một máy và cũng gửi nó qua dây tới một quá trình đang chạy trên một máy khác.
  3. Để tạo một bản sao của đối tượng ban đầu như một bản sao lưu trong khi làm việc trên đối tượng chính.
  4. Một tập hợp các đối tượng có thể dễ dàng được sao chép vào bảng tạm của hệ thống và sau đó dán vào cùng hoặc ứng dụng khác

Dưới đây là một số thuộc tính tùy chỉnh hữu ích được sử dụng trong quá trình tuần tự hóa một đối tượng

[Nối tiếp] -> Nó được sử dụng khi chúng ta đánh dấu tuần tự hóa của một đối tượng [NonSerialized] -> Nó được sử dụng khi chúng ta không muốn tuần tự hóa trường của đối tượng. [OnSerializing] -> Nó được sử dụng khi chúng tôi muốn thực hiện một số hành động trong khi tuần tự hóa một đối tượng [OnSerialized] -> Nó được sử dụng khi chúng tôi muốn thực hiện một số hành động sau khi tuần tự hóa một đối tượng thành luồng.

Dưới đây là ví dụ về tuần tự hóa

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

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

        [OnSerializing]
        private void OnSerializing(StreamingContext context) {
            Fname = "sheo";
            Lname = "Dayal";
        }
        [OnSerialized]
        private void OnSerialized(StreamingContext context)
        {
       // Do some work after serialized object
        }

    }

Đây là mã gọi

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

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

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

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

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

    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.