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?
Tôi phát hiện ra rằng một số lớp sử dụng [Serializable]
thuộc tính.
Câu trả lời:
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.
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 SerializableAttribute
cho 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 SerializableAttribute
ngay cả khi lớp cũng thực hiện ISerializable
giao 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 SerializableAttribute
theo mặc định được xê-ri hóa, trừ khi loại thực hiện ISerializable
giao 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 NonSerializedAttribute
cho 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.
Một số sử dụng thực tế cho [Serializable]
thuộc tính:
BinaryFormatter
lớp trong System.R nb.Serialization.Formatters.BinaryClipboard.SetData()
- các lớp không thể xác định có thể được đặt trên bảng tạm.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.
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ó.
Serializable
và không có khi thuộc tính bị xóa. Vì vậy, một số can thiệp là có thể.
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.
Đố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ớ.
Dưới đây là ví dụ ngắn về cách thức tuần tự hóa hoạt động. Tôi cũng đang học về cùng và tôi thấy hai liên kết hữu ích. Tuần tự hóa là gì và làm thế nào nó có thể được thực hiện trong .NET .
Một chương trình mẫu giải thích tuần tự hóa
Nếu bạn không hiểu chương trình trên, một chương trình đơn giản với nhiều lời giải thích được đưa ra ở đây .
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
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();
}
}
What is it?
stackoverflow.com/questions/3429921/what-does-serializable-mean